如何以编程方式编辑 Netlogo 的 setup.xml?

How can I edit the setup.xml for Netlogo programatically?

我已经在 NetLogo 中创建了一个模拟,我想 运行 在 Linux 集群上进行多个实验。我需要替换设置 xml 文件中的文件路径。

<enumeratedValueSet variable="str_critterpath">
  <value value="&quot;C:/Users/jorche/OneDrive - University of Leeds/Analysis/SimpleIBM/netlogo/critters.csv&quot;"/>
</enumeratedValueSet>

这是一个在 R 脚本中创建的新文件,它创建不同的 csv 输入供 NetLogo 使用。我将使用 R 脚本中的 system() 命令设置单个 运行s。

到目前为止,这是我的 R 脚本,带有一些散列标记,表示我需要在哪里制作具有不同路径的 xml 文件的副本。我可能想在稍后阶段更改其他变量.

library(gtools)

CreatCritterCSV = function(Run, NoCritters){
  x <- 1:21
  for (i in 1:10){
    print(i)
    aperm =  t(as.matrix(permute(x), nrow =1, ncol=21))
    if(i ==1){
      df = data.frame(aperm)
    }else{
      df[i,] = aperm
    }
  }
  filename = paste("critters", Run, ".csv", sep = "")
  write.table(df, file = filename,row.names=FALSE, na="",col.names=FALSE, sep=",")
  return(filename)
}


args <- commandArgs(trailingOnly = TRUE)
rnorm(RunNo=as.numeric(args[1]), NumberCritters=as.numeric(args[2]))

csvInput = CreatCritterCSV(RunNo, NumberCritters)

InSetupfile = "setup.xml"
#Replace the filepath to critters.csv
#
#
#
#

setupfile = paste("setup", RunNo, ".xml", sep = "")

NetLogoCommand = paste("/home/users/zabados/NetLogo/netlogo-headless.sh --model '/home/users/zabados/Ran.nlogo' --setup-file",  setupfile, "--experiment experiment --table RanTest.csv", sep = " ")

system(NetLogoCommand)

xml 安装文件是这样的:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE experiments SYSTEM "behaviorspace.dtd">
<experiments>
  <experiment name="experiment" repetitions="1" runMetricsEveryStep="false">
    <setup>setup</setup>
    <go>go</go>
    <exitCondition>StoppingStable</exitCondition>
    <metric>saveOutSingles</metric>
    <enumeratedValueSet variable="DiffIntraDen">
      <value value="false"/>
    </enumeratedValueSet>
    <enumeratedValueSet variable="DiffWalk">
      <value value="false"/>
    </enumeratedValueSet>
    <enumeratedValueSet variable="maxReproRate">
      <value value="0.05"/>
    </enumeratedValueSet>
    <enumeratedValueSet variable="NumberZetas">
      <value value="0"/>
    </enumeratedValueSet>
    <enumeratedValueSet variable="interdensity">
      <value value="1"/>
    </enumeratedValueSet>
    <enumeratedValueSet variable="ExtraMort">
      <value value="0.5"/>
    </enumeratedValueSet>
    <enumeratedValueSet variable="DiffMaxRepro">
      <value value="false"/>
    </enumeratedValueSet>
    <enumeratedValueSet variable="intraRadius">
      <value value="0"/>
    </enumeratedValueSet>
    <enumeratedValueSet variable="DiffSpeeds">
      <value value="false"/>
    </enumeratedValueSet>
    <enumeratedValueSet variable="GenSpec">
      <value value="false"/>
    </enumeratedValueSet>
    <enumeratedValueSet variable="DiffInterDen">
      <value value="false"/>
    </enumeratedValueSet>
    <enumeratedValueSet variable="DiffSpdCoe">
      <value value="false"/>
    </enumeratedValueSet>
    <enumeratedValueSet variable="DiffStartNum">
      <value value="false"/>
    </enumeratedValueSet>
    <enumeratedValueSet variable="interRadius">
      <value value="5"/>
    </enumeratedValueSet>
    <enumeratedValueSet variable="PopGrowExp">
      <value value="0.5"/>
    </enumeratedValueSet>
    <enumeratedValueSet variable="SameSpeed">
      <value value="5"/>
    </enumeratedValueSet>
    <enumeratedValueSet variable="logiMidpoint">
      <value value="11"/>
    </enumeratedValueSet>
    <enumeratedValueSet variable="Imortal_infert">
      <value value="false"/>
    </enumeratedValueSet>
    <enumeratedValueSet variable="DisplaySpecies">
      <value value="false"/>
    </enumeratedValueSet>
    <enumeratedValueSet variable="DripFeedRate">
      <value value="0"/>
    </enumeratedValueSet>
    <enumeratedValueSet variable="StartingExp">
      <value value="10"/>
    </enumeratedValueSet>
    <enumeratedValueSet variable="DiffExtraMort">
      <value value="false"/>
    </enumeratedValueSet>
    <enumeratedValueSet variable="SimpleDensity">
      <value value="true"/>
    </enumeratedValueSet>
    <enumeratedValueSet variable="str_critterpath">
      <value value="&quot;C:/Users/jorche/OneDrive - University of Leeds/Analysis/SimpleIBM/netlogo/critters.csv&quot;"/>
    </enumeratedValueSet>
    <enumeratedValueSet variable="intradensity">
      <value value="2"/>
    </enumeratedValueSet>
    <enumeratedValueSet variable="max_age">
      <value value="3"/>
    </enumeratedValueSet>
    <enumeratedValueSet variable="WalkType">
      <value value="&quot;Logistic&quot;"/>
    </enumeratedValueSet>
    <enumeratedValueSet variable="DiffAge">
      <value value="false"/>
    </enumeratedValueSet>
    <enumeratedValueSet variable="DripFeedNumber">
      <value value="1"/>
    </enumeratedValueSet>
    <enumeratedValueSet variable="SpeciesPresenceCutOff">
      <value value="1"/>
    </enumeratedValueSet>
    <enumeratedValueSet variable="SpeedCoef">
      <value value="0.4"/>
    </enumeratedValueSet>
    <enumeratedValueSet variable="DiffPopGrExp">
      <value value="false"/>
    </enumeratedValueSet>
    <enumeratedValueSet variable="walk_exp">
      <value value="0.6"/>
    </enumeratedValueSet>
    <enumeratedValueSet variable="CRW_multi">
      <value value="90"/>
    </enumeratedValueSet>
    <enumeratedValueSet variable="StartingEachSpecies">
      <value value="30"/>
    </enumeratedValueSet>
    <enumeratedValueSet variable="PrefMoveExp">
      <value value="0.5"/>
    </enumeratedValueSet>
    <enumeratedValueSet variable="MemLen">
      <value value="2000"/>
    </enumeratedValueSet>
  </experiment>
</experiments>

任何帮助将不胜感激。我试图 gsub xml 就好像它是一个没有乐趣的 txt 文件,并使用包 r xml 解析 xml 文件。没有快速到达任何地方。

干杯。

如果您只需要修改 xml 文件中的文件路径值,请尝试此功能:

modify_xml_filepath <- function(original_xml, 
                                new_filepath = "", 
                                new_experiment_name = "new_experiment.xml") {
    # Parse the original file
    parsed <- read_xml(original_xml)
    nodeset <- xml_children(xml_children(parsed)[[1]])

    # Get the node that stores the current path
    path_node_index <- which(xml_attrs(nodeset) == "str_critterpath")

    # Save the current value for removal
    to_remove <- xml_children(nodeset[[path_node_index]])

    # Add the new filepath, then remove the old one
    xml_add_child(nodeset[[path_node_index]], "value", "value" = new_filepath)
    xml_remove(to_remove)

    # Write out the modified file
    write_xml(parsed, new_experiment_name)
}

这样调用:

modify_xml_filepath(original_xml = "example_experiment.xml", 
                    new_filepath = "new_filepath_here",
                    new_experiment_name = "new_output.xml"
                    )

为我输出一个名为 "new_output.xml" 的新 xml 文件,其中 str_critterpath 被修改为:

<enumeratedValueSet variable="str_critterpath">
  <value value="new_filepath"/>
</enumeratedValueSet>

编辑: 要在输出 xml 文件中包含引号(与原始文件一样),请在第一个 xml_add_child(... 行上方添加此行:

new_filepath = paste("\"", new_filepath, "\"", sep = "")

新的文件路径节点现在看起来像:

<enumeratedValueSet variable="str_critterpath">
  <value value="&quot;new_filepath_here&quot;"/>
</enumeratedValueSet>

对于任何试图让这个解决方案与 Netlogo 和计算机集群一起工作的其他人,我不得不对 Luke C 的解决方案进行一些小的调整。这是因为 xml 文件在文件路径周围需要 "。我试图简单地将它们添加到文件路径并以 "&"quot; 结束,这导致了问题。因此我做了一些替换。它不那么漂亮,但现在正在处理集群。

modify_xml_filepath <- function(original_xml, 
                                new_filepath = "", 
                                new_experiment_name = "new_experiment.xml") {
  # Parse the original file
  parsed <- read_xml(original_xml)
  nodeset <- xml_children(xml_children(parsed)[[1]])

  # Get the node that stores the current path
  path_node_index <- which(xml_attrs(nodeset) == "str_critterpath")

  # Save the current value for removal
  to_remove <- xml_children(nodeset[[path_node_index]])


  New = gsub("C:/Users/jorche/OneDrive - University of Leeds/Analysis/SimpleIBM/netlogo/critters.csv", new_filepath, to_remove)
  New = sub("<", "", New)
  New = sub("/>", "", New)
  # Add the new filepath, then remove the old one
  #xml_add_child(nodeset[[path_node_index]], "value", "value" = new_filepath)
  xml_add_child(nodeset[[path_node_index]], New)
  xml_remove(to_remove)

  # Write out the modified file
  write_xml(parsed, new_experiment_name)
}