[{"data":1,"prerenderedAt":587},["ShallowReactive",2],{"/hpc":3,"/hpc-surround":576},{"id":4,"title":5,"body":6,"description":543,"extension":544,"meta":545,"navigation":563,"path":572,"seo":573,"stem":574,"__hash__":575},"content/hpc.md","Cluster Computing (HPC)",{"type":7,"value":8,"toc":528},"minimark",[9,21,35,72,80,83,97,108,111,118,121,137,146,156,163,170,185,190,196,205,208,225,228,234,237,279,282,287,293,298,304,310,317,320,323,326,335,338,346,359,368,379,386,389,395,399,405,409,417,426,436,438,444,447,484,488,494,498,504,514,520],[10,11,15],"h1",{"id":12,"className":13},"cluster-computing-hpc",[14],"section-heading",[16,17,5],"a",{"className":18,"href":20},[19],"section-anchor","#cluster-computing-hpc",[22,23,24,25,29,30,34],"p",{},"This document is an advanced guide that provides examples of how to run NetLogo ",[16,26,28],{"href":27},"/behaviorspace","BehaviorSpace"," experiments on a High-Performance Computing (HPC) cluster. The scripts provided in this guide are specifically for ",[31,32,33],"strong",{},"Slurm",", a popular open-source workload manager and job scheduler, but they can be adapted for use with other schedulers.",[36,37,40,50],"div",{"className":38},[39],"toc",[41,42,45],"h4",{"id":43,"className":44},"table-of-contents",[14],[16,46,49],{"className":47,"href":48},[19],"#table-of-contents","Table of Contents",[51,52,53,60,66],"ul",{},[54,55,56],"li",{},[16,57,59],{"href":58},"#installing-netlogo-on-a-cluster","Installing NetLogo on a Cluster",[54,61,62],{},[16,63,65],{"href":64},"#submitting-a-job","Submitting a Job",[54,67,68],{},[16,69,71],{"href":70},"#advanced-usage","Advanced Usage",[73,74,77],"h2",{"id":75,"className":76},"installing-netlogo-on-a-cluster",[14],[16,78,59],{"className":79,"href":58},[19],[22,81,82],{},"To run BehaviorSpace experiments, NetLogo must be installed on your HPC in a location accessible to the user.",[51,84,85,94],{},[54,86,87,88,93],{},"The easiest method is to download the desired NetLogo version (for most clusters this is the 64-bit Linux installation, available at ",[16,89,90],{"href":90,"rel":91},"https://www.netlogo.org/downloads/linux/",[92],"nofollow",") , unzip and move the entire folder to a directory on your HPC.",[54,95,96],{},"Alternatively, you can install NetLogo from the command line if your HPC allows it. For example, you can download and unzip the 64-bit Linux version of NetLogo 7.0.0 with:",[98,99,105],"pre",{"className":100,"code":102,"language":103,"meta":104},[101],"language-bash","curl -O https://ccl.northwestern.edu/netlogo/7.0.0/NetLogo-7.0.0-64.tgz\ntar zxf NetLogo-7.0.0-64.tgz\n","bash","",[106,107,102],"code",{"__ignoreMap":104},[22,109,110],{},"Note: Although NetLogo comes with a bundled Java installation, some HPC clusters require users to run only approved Java Runtime Environments (JREs). If that is the case, you must ensure that your HPC has a compatible JRE (Java 17 or higher). Please consult your HPC documentation or system administrator if unsure.",[73,112,115],{"id":113,"className":114},"submitting-a-job",[14],[16,116,65],{"className":117,"href":64},[19],[22,119,120],{},"This section provides two examples of how to run a BehaviorSpace experiment on an HPC using Slurm.",[122,123,124,131],"ol",{},[54,125,126,127,130],{},"A ",[31,128,129],{},"simple script",", which must be customized for each experiment and model.",[54,132,126,133,136],{},[31,134,135],{},"general script",", which takes arguments to automatically generate and submit a Slurm job script.",[22,138,139,140,145],{},"The simple script is easier to debug, while the general script is more convenient for repeated use. Both approaches are valid, and the scripts can also be found ",[16,141,144],{"href":142,"rel":143},"https://github.com/umit1010/slurm-scripts-for-netlogo",[92],"here on GitHub",".",[147,148,151],"h3",{"id":149,"className":150},"a-simple-example",[14],[16,152,155],{"className":153,"href":154},[19],"#a-simple-example","A simple example",[22,157,158,159,162],{},"The script below is a simple Slurm job submission template for NetLogo. Lines beginning with ",[106,160,161],{},"###"," provide explanations.",[22,164,165,166,169],{},"Save this script as ",[106,167,168],{},"simple_standalone_job.sh",". After updating it to match your HPC configuration, model, and experiment, you can submit it with:",[22,171,172],{},[106,173,174,181,182],{},[175,176,180],"span",{"className":177},[178,179],"token","variable","sbatch"," ",[175,183,168],{"className":184},[178,179],[22,186,187],{},[31,188,189],{},"Script:",[98,191,194],{"className":192,"code":193,"language":103,"meta":104},[101],"#!/bin/sh\n\n### ---\n### simple_standalone_job.sh\n### ---\n\n### Template standalone Slurm job submission script for NetLogo BehaviorSpace experiments\n\n#SBATCH --account=PROJECTID       ### replace PROJECTID with your allocation/project ID number.\n#SBATCH --partition=short         ### replace short with desired parition: medium, long, gengpu, etc.\n#SBATCH --time=1:30:00            ### time format is hh:mm:ss\n#SBATCH --nodes=1                 ### leave the --nodes as 1 because NetLogo can run into problems when trying to use multiple nodes\n#SBATCH --ntasks-per-node=16      ### replace 16 with the number of CPU cores you will request\n#SBATCH --mem=4G                  ### replace 4G with the amount of memory you will request; do not forget to put specify the units.\n#SBATCH --job-name=EXAMPLE_JOB    ### replace EXAMPLE_JOB with the name of your job (can be anything)\n#SBATCH --output=%x-%j.out        ### automatically generates an output file. Slurm replaces %x with job name you provided in the previous instruction and %j with the unique job id.\n#SBATCH --error=%x-%j.err         ### automatically generates an error file.\n#SBATCH --mail-type=ALL           ### replace ALL with BEGIN, END, or FAIL if you'd like to.\n#SBATCH --mail-user=U@SCHOOL.EDU  ### Replace U@SCHOOL.edu with your own email address so that Slurm can send you emails when your job is queried, started, completed, or terminated due to an error.\n\nmodule purge all\nmodule load java/jdk-17.0.2+8     ### You may need to update this line if your HPC doesn't have the jdk-17.0.2+8 module available.\n\nJVM_OPTS=(-Xmx1024m -server -XX:+UseParallelGC -Dfile.encoding=UTF-8 -Dnetlogo.extensions.dir=\"${BASE_DIR}/extensions\")\n\n### Make sure to update the NetLogo installation path, experiment name, model filename, experiment name and output filename variables in the following command.\njava ${JVM_OPTS[@]} -classpath PATH/TO/NETLOGO/lib/app/netlogo-7.0.0.jar org.nlogo.headless.Main --model \"MODELFILE.nlogo\" --experiment \"EXPERIMENT_NAME\" --threads 16 --table PATH/TO/OUT/FOLDER/OUTPUTFILE.csv\n",[106,195,193],{"__ignoreMap":104},[147,197,200],{"id":198,"className":199},"a-more-general-example",[14],[16,201,204],{"className":202,"href":203},[19],"#a-more-general-example","A more general example",[22,206,207],{},"Editing a submission file for each experiment can be tedious. The following scripts automate the process by generating a temporary job script with your chosen arguments and then submitting it.",[22,209,210,211,214,215,218,219,221,222,224],{},"Save the following as ",[106,212,213],{},"config.sh"," and ",[106,216,217],{},"generate_and_submit.sh",". Update ",[106,220,213],{}," with your account details, and adjust ",[106,223,217],{}," as needed for your HPC.",[22,226,227],{},"Run the script with:",[98,229,232],{"className":230,"code":231,"language":103,"meta":104},[101],"bash generate_and_submit.sh \u003Cmodel-file> \u003Cexperiment-name> \u003Ccategory> \u003Cmaxtime> \u003Cthreads> \u003Cram>\n",[106,233,231],{"__ignoreMap":104},[22,235,236],{},"Where the command-line arguments are:",[51,238,239,245,250,256,267,273],{},[54,240,241,244],{},[106,242,243],{},"model-file"," (including the file extension)",[54,246,247],{},[106,248,249],{},"experiment-name",[54,251,252,255],{},[106,253,254],{},"category"," (which partition to use: short, normal, long, gpu, etc.)",[54,257,258,261,262,266],{},[106,259,260],{},"maxtime"," (in ",[263,264,265],"em",{},"hh:mm:ss"," format)",[54,268,269,272],{},[106,270,271],{},"threads"," (number of CPU cores to request)",[54,274,275,278],{},[106,276,277],{},"ram"," (in megabytes)",[22,280,281],{},"This will automatically generate an intermediary bash script and then use it to submit the job. It will also delete the intermediary file after submission to prevent folder pollution.",[22,283,284],{},[31,285,286],{},"Example:",[98,288,291],{"className":289,"code":290,"language":103,"meta":104},[101],"bash generate_and_submit.sh fire.nlogo densityexp short 1:00:00 32 4096\n",[106,292,290],{"__ignoreMap":104},[22,294,295],{},[31,296,297],{},"Scripts:",[98,299,302],{"className":300,"code":301,"language":103,"meta":104},[101],"#!/bin/bash\n\n### ---\n### config.sh\n### ---\n\n# Update this script with your Slurm account information\n\n# your email address to receive notifications\nemail=youremail@yourinstitution.edu\n\n# The following variable should match your Slurm Allocation/Project ID\nproject=p00000\n\n# the experiment directory (absolute path)\npath=/home/username/projectfolder\n",[106,303,301],{"__ignoreMap":104},[98,305,308],{"className":306,"code":307,"language":103,"meta":104},[101],"#!/bin/bash\n\n### ---\n### generate_and_submit.sh\n### ---\n\n### A script to automate the slurm job submission process for NetLogo BehaviorSpace experiments\n\nmodel=$1\nexperiment=$2\ncategory=$4\nmaxtime=$5\nthreads=$6\nram=$7\n\n# NetLogo struggles to divide experiments between multiple physical processors\nmachines=1\n\n# load the config file to pull the shared variables\nsource config.sh\n\n### AUTO GENERATE A TEMPORARY SCRIPT TO RUN THE EXPERIMENT\n### This approach minimizes the repetitive editing and potential errors\n### that may arise from trying to manually edit long scripts\n\ntotalram=$((ram*threads+4096))\nmodelpath=${path}/${model}\n\nrunfile=run_${experiment}.sh\n\n# if a file with the same name exists, just delete it\nif test -f $runfile ; then\n    rm $runfile\nfi\n\n# create the slurm job definition within the run file\necho \"#!/bin/sh\" >> $runfile\necho \"#SBATCH --account=\"${project} >> $runfile\necho \"#SBATCH --partition=\"${category} >> $runfile\necho \"#SBATCH --time=\"${maxtime} >> $runfile\necho \"#SBATCH --nodes=\"${machines} >> $runfile\necho \"#SBATCH --ntasks-per-node=\"${threads} >> $runfile\necho \"#SBATCH --mem=\"$((totalram/1024))G >> $runfile\necho \"#SBATCH --job-name=\"${experiment} >> $runfile\necho \"#SBATCH --output=output_%x-%j.out\" >> $runfile\necho \"#SBATCH --mail-type=\"ALL >> $runfile\necho \"#SBATCH --mail-user=\"${email} >> $runfile\n\necho \"module purge all\" >> $runfile\necho \"module load java/jdk-17.0.2+8\" >> $runfile\n\necho \"JVM_OPTS=(-Xmx${totalram}m -server -XX:+UseParallelGC -Dfile.encoding=UTF-8 -Dnetlogo.extensions.dir=\"${BASE_DIR}/extensions\")\" >> $runfile\n\necho \"java ${JVM_OPTS[@]} -classpath ${path}/netlogo/lib/app/netlogo-7.0.0.jar org.nlogo.headless.Main --model ${modelpath} --setup-file ${path}/xml/${experiment}.xml --threads $threads --table ${path}/csv/${experiment}.csv\" >> $runfile\n\necho \"Job ID: \"\n\n# submit the job and print the job number\nsbatch --parsable $runfile\n\n# remove the temporary run file to keep things clean\nrm $runfile\n",[106,309,307],{"__ignoreMap":104},[73,311,314],{"id":312,"className":313},"advanced-usage",[14],[16,315,71],{"className":316,"href":70},[19],[22,318,319],{},"NetLogo includes built-in parallelization, but this often does not integrate well with multi-node HPC architectures. Large BehaviorSpace experiments with many parameter combinations and repetitions that require hundreds or thousands of runs may crash if distributed directly across multiple nodes.",[22,321,322],{},"A better strategy is to split the experiment into many small jobs (one per parameter combination and repetition).",[22,324,325],{},"To do so, first we need to subdivide our NetLogo BehaviorSpace experiment into separate BehaviorSpace experiment files (xml files) for each parameter combination.",[147,327,330],{"id":328,"className":329},"dividing-behaviorspace-experiments-into-smaller-sub-experiments",[14],[16,331,334],{"className":332,"href":333},[19],"#dividing-behaviorspace-experiments-into-smaller-sub-experiments","Dividing BehaviorSpace experiments into smaller sub-experiments",[22,336,337],{},"This step can be performed on your local machine, not necessarily on an HPC.",[122,339,340],{},[54,341,342,343,145],{},"Export your BehaviorSpace experiment as an XML file. In BehaviorSpace, select your experiment and click ",[263,344,345],{},"Export",[22,347,348],{},[349,350],"img",{"alt":351,"className":352,"src":354,"width":355,"height":356,"style":357},"hpc/export.webp",[353],"netlogo-image","/_content/images/hpc/export.webp",410,327,{"aspectRatio":358},"410/327",[51,360,361],{},[54,362,363,364,367],{},"For maximum parallelization, set repetitions to ",[31,365,366],{},"1"," before exporting. This allows submitting a separate job for each repetition.",[122,369,371],{"start":370},2,[54,372,373,374,145],{},"Use the exported XML file to generate individual experiment files. Instructions and a Jupyter notebook can be found ",[16,375,378],{"href":376,"rel":377},"https://github.com/can-gurkan/BehaviorSpace_exp_split",[92],"here",[22,380,381,382,385],{},"Alternatively, you can run the Python script below (",[106,383,384],{},"split_bspace_exps.py",") if you have Python installed on your machine. It is the same script linked above which generates one XML experiment file per parameter combination.",[22,387,388],{},"Run as:",[98,390,393],{"className":391,"code":392,"language":103,"meta":104},[101],"python split_bspace_exps.py \u003Cinput_file_name> \u003Coutput_folder_path>\n",[106,394,392],{"__ignoreMap":104},[22,396,397],{},[31,398,286],{},[98,400,403],{"className":401,"code":402,"language":103,"meta":104},[101],"python split_bspace_exps.py /path/to/example-experiment.xml /path/to/output/folder/\n",[106,404,402],{"__ignoreMap":104},[22,406,407],{},[31,408,189],{},[98,410,415],{"className":411,"code":413,"language":414,"meta":104},[412],"language-python","\"\"\"split_bspace_exps.py\n\nThis script splits a NetLogo BehaviorSpace experiment into multiple experiments, each with a different set of parameters.\nThe inputs are a BehaviorSpace experiment xml file and the output folder path.\nThe output is a folder with the new experiments, one for each combination of parameters.\n\nUsage: python split_bspace_exps.py \u003Cinput_file_name> \u003Coutput_folder_path>\nExample: python split_bspace_exps.py /path/to/example-experiment.xml /path/to/output/folder/\n\"\"\"\n\nimport sys\nimport xml.etree.ElementTree as ET\nfrom itertools import product\nfrom pathlib import Path\n\ndef dict_product(d):\n    \"\"\"\n    Given a dictionary of parameters and their values, return a generator that yields a dictionary for each combination of parameters.\n    \"\"\"\n    keys = d.keys()\n    for element in product(*d.values()):\n        yield dict(zip(keys, element))\n\ndef construct_pdict(file_name):\n    \"\"\"\n    Given a BehaviorSpace experiment xml file, return a dictionary of parameters and their values.\n    \"\"\"\n    tree = ET.parse(file_name)\n    root = tree.getroot()\n    pdict = {}\n    for node in root.findall('.//enumeratedValueSet'):\n        plist = []\n        for child in node:\n            plist.append(child.attrib.get('value'))\n        if len(plist) > 1:\n            pdict[node.get('variable')] = plist\n    for node in root.findall('.//steppedValueSet'):\n        rstart = node.attrib.get('first')\n        rend = node.attrib.get('last')\n        rstep = node.attrib.get('step')\n        plist = range(int(rstart), int(rend)+int(rstep), int(rstep))\n        pdict[node.get('variable')] = [str(num) for num in plist]\n    print(pdict)\n    return pdict\n\ndef process_xml(file, dict, new_folder):\n    \"\"\"\n    Given a BehaviorSpace experiment xml file, a dictionary of parameters and their values, and a new folder,\n    create a new experiment xml file for each combination of parameters and save it to the new folder.\n    \"\"\"\n    tree = ET.parse(file)\n    root = tree.getroot()\n    counter = 0\n    name_list = []\n    Path(new_folder).mkdir(parents=True, exist_ok=True)\n    for cd in dict_product(dict):\n        exp_name_str = 'exp' + str(counter)\n        name_list.append([exp_name_str,list(cd.values())])\n        root[0].set('name', exp_name_str)\n\n        for k,v in cd.items():\n            # first delete all elements matching the tag\n            elements_to_remove = root.findall('.//*[@variable=\"'+k+'\"]')\n            for element in elements_to_remove:\n                # Iterate through the entire tree to find the parent of the current element\n                for parent in root.iter():\n                    if element in parent:\n                        parent.remove(element)\n                        break\n            # Now insert the appropriate elements\n            target_item = root.find('.//constants')\n            new_element_str = f'\u003CenumeratedValueSet variable=\"{k}\">\u003Cvalue value=\"{v}\">\u003C/value>\u003C/enumeratedValueSet>'\n            new_element = ET.fromstring(new_element_str)\n            target_item.append(new_element)\n\n        with open(new_folder+exp_name_str+'.xml', 'wb') as f:\n            ET.indent(root, space=\"  \")\n            tree.write(f, 'utf-8', xml_declaration=True)\n        counter += 1\n    print(f'{counter} experiments created')\n    print('\\nexp_name', list(cd.keys()))\n    for i in name_list:\n        print(i)\n\ndef split_exps(file_name,new_folder):\n    \"\"\"\n    Given a BehaviorSpace experiment xml file and a new folder,\n    construct a dictionary of parameters and their values,\n    and create a new experiment xml file for each combination of parameters and save it to the new folder.\n    \"\"\"\n    pdict = construct_pdict(file_name)\n    process_xml(file_name, pdict, new_folder)\n\ndef check_args(args):\n    \"\"\"\n    Given a list of arguments, check if the arguments are valid.\n    \"\"\"\n    if len(args) != 3:\n        print('Error: Invalid number of arguments')\n        print('Usage: python split_bspace_exps.py \u003Cinput_file_name> \u003Coutput_folder_path>')\n        print('Example: python split_bspace_exps.py /path/to/example-experiment.xml /path/to/output/folder/')\n        sys.exit(1)\n    if not Path(args[1]).exists():\n        print('Error: input_file_name does not exist')\n        sys.exit(1)\n\n\nif __name__ == '__main__':\n\n    check_args(sys.argv)\n    split_exps(sys.argv[1], sys.argv[2])\n    print('Done')\n","python",[106,416,413],{"__ignoreMap":104},[147,418,421],{"id":419,"className":420},"submitting-separate-jobs-for-each-experiment-file",[14],[16,422,425],{"className":423,"href":424},[19],"#submitting-separate-jobs-for-each-experiment-file","Submitting separate jobs for each experiment file",[22,427,428,429,432,433,435],{},"Once you have a directory of XML files, you can use the script below (",[106,430,431],{},"deployment.bash",") to submit each as a separate job. It uses the ",[106,434,217],{}," script described earlier.",[22,437,388],{},[98,439,442],{"className":440,"code":441,"language":103,"meta":104},[101],"bash deployment.bash \u003Cexperiment-directory> \u003Cnetlogo-model> \u003Cnum-repetitions> \u003Ccategory> \u003Cmaxtime> \u003Cthreads> \u003Cram>\n",[106,443,441],{"__ignoreMap":104},[22,445,446],{},"Where the arguments are:",[51,448,449,455,460,466,470,476,480],{},[54,450,451,454],{},[106,452,453],{},"experiment-directory"," (path to directory that contains the xml files)",[54,456,457],{},[106,458,459],{},"netlogo-model",[54,461,462,465],{},[106,463,464],{},"num-repetitions"," (how many repetitions to run for each experiment. note that this should be 1 if you did not edit the number of repetitions in your experiment before exporting)",[54,467,468,255],{},[106,469,254],{},[54,471,472,261,474,266],{},[106,473,260],{},[263,475,265],{},[54,477,478,272],{},[106,479,271],{},[54,481,482,278],{},[106,483,277],{},[22,485,486],{},[31,487,286],{},[98,489,492],{"className":490,"code":491,"language":103,"meta":104},[101],"bash deployment.bash /directory/of/xmls/ fire.nlogo 1 short 1:00:00 1 4096\n",[106,493,491],{"__ignoreMap":104},[22,495,496],{},[31,497,189],{},[98,499,502],{"className":500,"code":501,"language":103,"meta":104},[101],"### ---\n### deployment.bash\n### ---\n\nif [ $# -ne 7 ]\nthen\n  echo \"Usage 'bash deployment.bash /directory/of/xmls/ /path/to/model.nlogo number-of-reps partition max-time threads memory'\"\n  exit 1\nfi\n\n#XML_DIR= directory of BehaviorSpace exoeriment files\nXML_DIR=$1\n#MODEL= path to NetLogo model\nMODEL=$2\n#REPS= number of repetitions for each experiment\nREPS=$3\n#CATEGORY= partition\nCATEGORY=$4\n#MAXTIME= time limit\nMAXTIME=$5\n#THREADS= number of cpus (should be 1 in general)\nTHREADS=$6\n#RAM= max ram for each cpu in mb\nRAM=$7\n\nfor iter in $(seq 1 $REPS); do\n  for SETUPFILE in $(ls ${XML_DIR}/*.xml); do\n    EXPR=\"$(basename ${SETUPFILE%.*})\"\n    #echo $SETUPFILE\n    #echo $EXPR\n    bash generate_and_submit.sh $MODEL $SETUPFILE $CATEGORY $MAXTIME $THREADS $RAM;\n    sleep 2 # Avoid overloading the scheduler\n  done\ndone\n",[106,503,501],{"__ignoreMap":104},[22,505,506,509,510,513],{},[31,507,508],{},"Note:"," This script inserts a 2-second pause after each submission to avoid overwhelming the scheduler. For very large experiments, consider running it in the background with ",[106,511,512],{},"screen",". For example:",[98,515,518],{"className":516,"code":517,"language":103,"meta":104},[101],"screen -dmS session_name bash deployment.sh /directory/of/xmls/ fire.nlogo short 1:00:00 1 4096\n",[106,519,517],{"__ignoreMap":104},[22,521,522,523,145],{},"The most up-to-date versions of these scripts, along with additional utilities and scripts, can be found ",[16,524,527],{"href":525,"rel":526},"https://github.com/can-gurkan/BehaviorSpace-HPC",[92],"on BehaviorSpace HPC GitHub Repository",{"title":104,"searchDepth":529,"depth":530,"links":531},5,3,[532,534,535,539],{"id":43,"depth":533,"text":49},4,{"id":75,"depth":370,"text":59},{"id":113,"depth":370,"text":65,"children":536},[537,538],{"id":149,"depth":530,"text":155},{"id":198,"depth":530,"text":204},{"id":312,"depth":370,"text":71,"children":540},[541,542],{"id":328,"depth":530,"text":334},{"id":419,"depth":530,"text":425},"An advanced guide on running NetLogo BehaviorSpace experiments on High-Performance Computing (HPC) clusters using Slurm job scheduler.","md",{"source":546,"metadataOutputPath":547,"projectConfig":548,"language":555,"inheritFrom":564,"output":563,"version":549,"keywords":565,"tags":569,"icon":570,"assetsRoot":571},"autogen/hpc.md","content/hpc.metadata.yaml",{"version":549,"projectRoot":145,"scanRoot":550,"outputRoot":551,"defaults":552,"engine":558,"partials":559,"dedupeIdenticalDiskWrites":563},"7.1.0-alpha1","autogen","content",{"inheritFrom":553,"language":555,"output":556,"extension":544,"title":557,"version":549},[554],0,"en",false,"NetLogo User Manual","handlebars",{"directoryPaths":560,"extensions":561},[145],[562,544],"mustache",true,[554],[566,567,568,33],"HPC","High-Performance Computing","Cluster Computing",[566,567,568],"i-lucide-server-cog","/home/jason/Desktop/Development/NetLogo/branches/NetLogo/main2/helio/apps/docs/autogen","/hpc",{"title":5,"description":543},"hpc","1IuqQ3NIvEyQafc5wRZ1iJ0Z9Dz32ouaZnLBFVObvUo",[577,582],{"title":578,"path":579,"stem":580,"description":581},"GoGo Extension Dictionary: talk-to-servo-ports","/gogo/talk-to-servo-ports","gogo/talk-to-servo-ports","Documentation for the talk-to-servo-ports primitive.",{"title":583,"path":584,"stem":585,"description":586},"HubNet","/hubnet","hubnet","HubNet is a technology that lets you use NetLogo to run participatory simulations in the classroom where multiple users can interact with the model.",1786664216669]