From f1c2df31d90066e7b346a6c112296467a04cf36f Mon Sep 17 00:00:00 2001 From: Kevin D Date: Wed, 25 Feb 2026 11:44:59 -0800 Subject: [PATCH] csv parse update --- @miSim/initializeFromCsv.m | 12 +++++++ @miSim/miSim.m | 2 ++ @miSim/readScenarioCsv.m | 34 +++++++++++++++++++ aerpaw/controller.coderprj | 7 +++- .../J2y3iIxdkUJ49I60U1-dbvlUZyUd.xml | 6 ++++ .../J2y3iIxdkUJ49I60U1-dbvlUZyUp.xml | 2 ++ .../vwbzJJGw3UOF-cRWFJkBEPYkv-cd.xml | 6 ++++ .../vwbzJJGw3UOF-cRWFJkBEPYkv-cp.xml | 2 ++ test/parametricTestSuite.m | 34 ++----------------- 9 files changed, 72 insertions(+), 33 deletions(-) create mode 100644 @miSim/initializeFromCsv.m create mode 100644 @miSim/readScenarioCsv.m create mode 100644 resources/project/SIL3u_W39LwE7HHYsarfFmr9gVQ/J2y3iIxdkUJ49I60U1-dbvlUZyUd.xml create mode 100644 resources/project/SIL3u_W39LwE7HHYsarfFmr9gVQ/J2y3iIxdkUJ49I60U1-dbvlUZyUp.xml create mode 100644 resources/project/SIL3u_W39LwE7HHYsarfFmr9gVQ/vwbzJJGw3UOF-cRWFJkBEPYkv-cd.xml create mode 100644 resources/project/SIL3u_W39LwE7HHYsarfFmr9gVQ/vwbzJJGw3UOF-cRWFJkBEPYkv-cp.xml diff --git a/@miSim/initializeFromCsv.m b/@miSim/initializeFromCsv.m new file mode 100644 index 0000000..c1faa20 --- /dev/null +++ b/@miSim/initializeFromCsv.m @@ -0,0 +1,12 @@ +function obj = initializeFromCsv(obj, csvPath) + arguments (Input) + obj (1, 1) {mustBeA(obj, 'miSim')}; + csvPath (1, 1) string; + end + arguments (Output) + obj (1, 1) {mustBeA(obj, 'miSim')}; + end + + params = obj.readScenarioCsv(tc.csvPath); + +end \ No newline at end of file diff --git a/@miSim/miSim.m b/@miSim/miSim.m index 66943b4..dcabeff 100644 --- a/@miSim/miSim.m +++ b/@miSim/miSim.m @@ -64,6 +64,7 @@ classdef miSim obj.agents = {agent}; end [obj] = initialize(obj, domain, agents, barrierGain, barrierExponent, minAlt, timestep, maxIter, obstacles, makePlots, makeVideo); + [obj] = initializeFromCsv(obj, csvPath); [obj] = run(obj); [obj] = lesserNeighbor(obj); [obj] = constrainMotion(obj); @@ -77,6 +78,7 @@ classdef miSim [obj] = plotH(obj); [obj] = updatePlots(obj); [obj] = teardown(obj); + inits = readScenarioCsv(csvPath); writeInits(obj); validate(obj); end diff --git a/@miSim/readScenarioCsv.m b/@miSim/readScenarioCsv.m new file mode 100644 index 0000000..c79a017 --- /dev/null +++ b/@miSim/readScenarioCsv.m @@ -0,0 +1,34 @@ +function scenario = readScenarioCsv(obj, csvPath) + arguments (Input) + obj (1, 1) {mustBeA(obj, 'miSim')}; + csvPath (1, 1) string; + end + arguments (Output) + scenario struct; + end + + % File input validation + assert(isfile(csvPath), "%s is not a valid filepath."); + assert(endsWith(csvPath, ".csv"), "%s is not a CSV file."); + + % Read file + csv = readtable(csvPath, "TextType", "String", "NumHeaderLines", 0, "VariableNamingRule", "Preserve"); + csv.Properties.VariableNames = ["timestep", "maxIter", "minAlt", "discretizationStep", "protectedRange", "sensorPerformanceMinimum", "initialStepSize", "barrierGain", "barrierExponent", "numObstacles", "numAgents", "collisionRadius", "comRange", "alphaDist", "betaDist", "alphaTilt", "betaTilt"]; + + for ii = 1:size(csv.Properties.VariableNames, 2) + csv.(csv.Properties.VariableNames{ii}) = cell2mat(cellfun(@(x) str2num(x), csv.(csv.Properties.VariableNames{ii}), "UniformOutput", false)); + end + + % Put params into standard structure + scenario = struct("timestep", csv.timestep, "maxIter", csv.maxIter, "minAlt", csv.minAlt, "discretizationStep", csv.discretizationStep, ... + "protectedRange", csv.protectedRange, "sensorPerformanceMinimum", csv.sensorPerformanceMinimum, "initialStepSize", csv.initialStepSize, ... + "barrierGain", csv.barrierGain, "barrierExponent", csv.barrierExponent, "numObstacles", csv.numObstacles,... + "numAgents", csv.numAgents, "collisionRadius", csv.collisionRadius, "comRange", csv.comRange, "alphaDist", csv.alphaDist, ... + "betaDist", csv.betaDist, "alphaTilt", csv.alphaTilt, "betaTilt", csv.betaTilt); + + % size check + fns = fieldnames(scenario); + for ii = 2:size(fns, 1) + assert(size(scenario.(fns{ii}), 1) == size(scenario.(fns{ii - 1}), 1), "Mismatched number of rows in scenario definition CSV"); + end +end \ No newline at end of file diff --git a/aerpaw/controller.coderprj b/aerpaw/controller.coderprj index e74bcc8..5565058 100644 --- a/aerpaw/controller.coderprj +++ b/aerpaw/controller.coderprj @@ -83,6 +83,11 @@ + + int32 + + + @@ -1074,7 +1079,7 @@ true - 2026-02-24T18:31:43 + 2026-02-25T11:42:50 diff --git a/resources/project/SIL3u_W39LwE7HHYsarfFmr9gVQ/J2y3iIxdkUJ49I60U1-dbvlUZyUd.xml b/resources/project/SIL3u_W39LwE7HHYsarfFmr9gVQ/J2y3iIxdkUJ49I60U1-dbvlUZyUd.xml new file mode 100644 index 0000000..99772b4 --- /dev/null +++ b/resources/project/SIL3u_W39LwE7HHYsarfFmr9gVQ/J2y3iIxdkUJ49I60U1-dbvlUZyUd.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/resources/project/SIL3u_W39LwE7HHYsarfFmr9gVQ/J2y3iIxdkUJ49I60U1-dbvlUZyUp.xml b/resources/project/SIL3u_W39LwE7HHYsarfFmr9gVQ/J2y3iIxdkUJ49I60U1-dbvlUZyUp.xml new file mode 100644 index 0000000..5f9a59a --- /dev/null +++ b/resources/project/SIL3u_W39LwE7HHYsarfFmr9gVQ/J2y3iIxdkUJ49I60U1-dbvlUZyUp.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/resources/project/SIL3u_W39LwE7HHYsarfFmr9gVQ/vwbzJJGw3UOF-cRWFJkBEPYkv-cd.xml b/resources/project/SIL3u_W39LwE7HHYsarfFmr9gVQ/vwbzJJGw3UOF-cRWFJkBEPYkv-cd.xml new file mode 100644 index 0000000..99772b4 --- /dev/null +++ b/resources/project/SIL3u_W39LwE7HHYsarfFmr9gVQ/vwbzJJGw3UOF-cRWFJkBEPYkv-cd.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/resources/project/SIL3u_W39LwE7HHYsarfFmr9gVQ/vwbzJJGw3UOF-cRWFJkBEPYkv-cp.xml b/resources/project/SIL3u_W39LwE7HHYsarfFmr9gVQ/vwbzJJGw3UOF-cRWFJkBEPYkv-cp.xml new file mode 100644 index 0000000..c4b615c --- /dev/null +++ b/resources/project/SIL3u_W39LwE7HHYsarfFmr9gVQ/vwbzJJGw3UOF-cRWFJkBEPYkv-cp.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/test/parametricTestSuite.m b/test/parametricTestSuite.m index f014593..f732413 100644 --- a/test/parametricTestSuite.m +++ b/test/parametricTestSuite.m @@ -25,41 +25,11 @@ classdef parametricTestSuite < matlab.unittest.TestCase end end - methods (Static) - function params = readIterationsCsv(csvPath) - arguments (Input) - csvPath (1, 1) string; - end - arguments (Output) - params (1, 1) struct; - end - - % File input validation - assert(isfile(csvPath), "%s is not a valid filepath."); - assert(endsWith(csvPath, ".csv"), "%s is not a CSV file."); - - % Read file - csv = readtable(csvPath, "TextType", "String", "NumHeaderLines", 0, "VariableNamingRule", "Preserve"); - csv.Properties.VariableNames = ["timestep", "maxIter", "minAlt", "discretizationStep", "protectedRange", "sensorPerformanceMinimum", "initialStepSize", "barrierGain", "barrierExponent", "numObstacles", "numAgents", "collisionRadius", "comRange", "alphaDist", "betaDist", "alphaTilt", "betaTilt"]; - - for ii = 1:size(csv.Properties.VariableNames, 2) - csv.(csv.Properties.VariableNames{ii}) = cell2mat(cellfun(@(x) str2num(x), csv.(csv.Properties.VariableNames{ii}), "UniformOutput", false)); - end - - % Put params into standard structure - params = struct("timestep", csv.timestep, "maxIter", csv.maxIter, "minAlt", csv.minAlt, "discretizationStep", csv.discretizationStep, ... - "protectedRange", csv.protectedRange, "sensorPerformanceMinimum", csv.sensorPerformanceMinimum, "initialStepSize", csv.initialStepSize, ... - "barrierGain", csv.barrierGain, "barrierExponent", csv.barrierExponent, "numObstacles", csv.numObstacles,... - "numAgents", csv.numAgents, "collisionRadius", csv.collisionRadius, "comRange", csv.comRange, "alphaDist", csv.alphaDist, ... - "betaDist", csv.betaDist, "alphaTilt", csv.alphaTilt, "betaTilt", csv.betaTilt); - end - end - methods (Test) % Test cases - function csv_parametric_tests(tc) + function csv_parametric_tests_random_agents(tc) % Read in parameters to iterate over - params = tc.readIterationsCsv(tc.csvPath); + params = tc.testClass.readScenarioCsv(tc.csvPath); % Test case setup l = 10; % domain size