Как я могу редактировать setup.xml для Netlogo программно? - PullRequest
0 голосов
/ 19 октября 2018

Я создал симуляцию в 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.Я собираюсь установить одиночные прогоны, используя команду system () в сценарии R.

Здесь приведен мой сценарий 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, как будто это текстовый файл без удовольствия и проанализировать XML-файл с помощью пакета r xml.Быстро никуда не денется.

Приветствия.

Ответы [ 2 ]

0 голосов
/ 22 октября 2018

Всем, кто пытался заставить это решение работать с 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)
}
0 голосов
/ 20 октября 2018

Если вам просто нужно изменить значение filepath в вашем 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"
                    )

Выводит для меня новый XML-файлназывается "new_output.xml", где str_critterpath изменяется на:

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

Редактировать: Чтобы включить цитаты в выходной XML-файл (как в оригинале), добавьте этострока над первой xml_add_child(... строкой:

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

Новый узел filepath теперь будет выглядеть так:

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