如何以编程方式编辑 Netlogo 的 setup.xml?
How can I edit the setup.xml for Netlogo programatically?
我已经在 NetLogo 中创建了一个模拟,我想 运行 在 Linux 集群上进行多个实验。我需要替换设置 xml 文件中的文件路径。
<enumeratedValueSet variable="str_critterpath">
<value value=""C:/Users/jorche/OneDrive - University of Leeds/Analysis/SimpleIBM/netlogo/critters.csv""/>
</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=""C:/Users/jorche/OneDrive - University of Leeds/Analysis/SimpleIBM/netlogo/critters.csv""/>
</enumeratedValueSet>
<enumeratedValueSet variable="intradensity">
<value value="2"/>
</enumeratedValueSet>
<enumeratedValueSet variable="max_age">
<value value="3"/>
</enumeratedValueSet>
<enumeratedValueSet variable="WalkType">
<value value=""Logistic""/>
</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=""new_filepath_here""/>
</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)
}
我已经在 NetLogo 中创建了一个模拟,我想 运行 在 Linux 集群上进行多个实验。我需要替换设置 xml 文件中的文件路径。
<enumeratedValueSet variable="str_critterpath">
<value value=""C:/Users/jorche/OneDrive - University of Leeds/Analysis/SimpleIBM/netlogo/critters.csv""/>
</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=""C:/Users/jorche/OneDrive - University of Leeds/Analysis/SimpleIBM/netlogo/critters.csv""/>
</enumeratedValueSet>
<enumeratedValueSet variable="intradensity">
<value value="2"/>
</enumeratedValueSet>
<enumeratedValueSet variable="max_age">
<value value="3"/>
</enumeratedValueSet>
<enumeratedValueSet variable="WalkType">
<value value=""Logistic""/>
</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=""new_filepath_here""/>
</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)
}