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