Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Candidate #215

Merged
merged 91 commits into from
Jun 15, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
91 commits
Select commit Hold shift + click to select a range
0118772
Added metabolic cost calculation
MarlenyVega May 15, 2023
c9025c6
Added ability to include metabolic cost as a cost term
MarlenyVega May 15, 2023
d4c5e75
Fix preprocessing file manipulation
SpencerTWilliams May 16, 2023
d02741f
Account for extra EMG columns in MTP, "_moment" suffix in ID
SpencerTWilliams May 16, 2023
572c04f
Fix saving MTP results to .osimx
SpencerTWilliams May 16, 2023
d080cb7
changed cost term format
cvhammond May 16, 2023
4716dd0
fixed TO inputs cost term
cvhammond May 16, 2023
9a5673d
fixed cost term inputs
cvhammond May 16, 2023
5e7ccab
changed cost terms
cvhammond May 16, 2023
adcbcf6
added user_defined cost term
cvhammond May 16, 2023
aa5c3cd
Make parsing MTP results in NCP optional, fix updating values from pr…
SpencerTWilliams May 17, 2023
f84bc6e
implement initial user_defined
cvhammond May 17, 2023
fc539fa
Save optimized max isometric stress from MTP, account for turning off…
SpencerTWilliams May 18, 2023
8ef0b1f
Fix length scale factors, max isometric force importing from MTP
SpencerTWilliams May 18, 2023
9996bd3
Fix NCP with no MTP results, save NCP precal to osimx
SpencerTWilliams May 19, 2023
e198e08
Save GCP kinematics with correct column names, start implementing app…
SpencerTWilliams May 19, 2023
9b8585b
separated design variable parts in xml
cvhammond May 19, 2023
2c79282
Fix prepareGCPInputs arguments
SpencerTWilliams May 19, 2023
bb87ca0
added manual scaling
cvhammond May 20, 2023
c11debe
Update GCP osimx
SpencerTWilliams May 22, 2023
76f9878
consolidated report fn
cvhammond May 23, 2023
786b58b
consolidated tool input generation
cvhammond May 23, 2023
93f7ad0
consolidated values struct creation
cvhammond May 23, 2023
f7c4b4f
update DO integrand calc
cvhammond May 23, 2023
e0ffc57
moved cost terms to separate fn
cvhammond May 23, 2023
461c4e6
Merge branch 'consolidateTreatmentOptimizationTools' into ExpansionCo…
cvhammond May 23, 2023
67ac1c3
Merge pull request #195 from rcnl-org/ExpansionCostTerms
cvhammond May 23, 2023
2649f6f
merged metabolic cost in
cvhammond May 23, 2023
c6c678f
Fix saving contact surface to osimx when a surface already exists in …
SpencerTWilliams May 24, 2023
17e35c6
fix small no-arg issues
cvhammond May 24, 2023
a0317c5
fixed formatting
cvhammond May 24, 2023
c86527a
Merge pull request #196 from rcnl-org/UserDefinedStaticParameterWithS…
cvhammond May 24, 2023
2758807
Delete reportDesignOptimizationResults.m
cvhammond May 24, 2023
afed629
Merge pull request #197 from rcnl-org/UserDefinedStaticParameter
cvhammond May 24, 2023
77c7f09
Merge pull request #199 from rcnl-org/consolidateTreatmentOptimizatio…
cvhammond May 24, 2023
eaee26c
Point kinematics mex alternative
SpencerTWilliams May 24, 2023
57da189
Merge branch 'parallel-pool-mex-alternative' into merging-dev-parpool
SpencerTWilliams May 24, 2023
ec9c6aa
Merge pull request #200 from rcnl-org/merging-dev-parpool
SpencerTWilliams May 24, 2023
e8b7d66
Fix result reporting
SpencerTWilliams May 24, 2023
a619905
Parallelize inverse dynamics
SpencerTWilliams May 24, 2023
131934b
Use persistent variables for speed
SpencerTWilliams May 24, 2023
91cd2a2
Fix parallelized functions
SpencerTWilliams May 24, 2023
fee56c0
Fix coordinate constraint indexing
SpencerTWilliams May 25, 2023
7580a30
Fix integrand for models with fewer IK columns than coordinates
SpencerTWilliams May 25, 2023
19ca347
Update terminal constraint type names
SpencerTWilliams May 25, 2023
7a1840c
Use mex pointKinematics and ID for Windows, Matlab parallel otherwise
SpencerTWilliams May 25, 2023
8f20fb6
Move pointKinematics, ID to core treatment optimization folder
SpencerTWilliams May 25, 2023
810f5f9
Preallocate Matlab implementation outputs for speed
SpencerTWilliams May 25, 2023
47dff56
Account for mex/Matlab switch in integrand
SpencerTWilliams May 25, 2023
d99dd20
Move ID/point kinematics persistent clear for speed
SpencerTWilliams May 26, 2023
299baf9
Initialize mex and Matlab parallel for TO, VO, DO
SpencerTWilliams May 26, 2023
8048b7a
Preallocation for speed
SpencerTWilliams May 26, 2023
63694b1
updated VO and TO cost terms
cvhammond May 30, 2023
33f6ee7
Fixed calcMetabolicCost function
MarlenyVega May 30, 2023
44db0b9
Fix EMG processing
SpencerTWilliams May 31, 2023
f0b64e1
New linear inequality constraints for MTP SynX
SpencerTWilliams Jun 1, 2023
02debea
Updated formulation for free final time
MarlenyVega Jun 1, 2023
0b7f1ff
Parse NCP symmetry as toggle
SpencerTWilliams Jun 2, 2023
3ca0553
Merge pull request #201 from rcnl-org/TOXMLUpdate
cvhammond Jun 2, 2023
3a7f719
Finished up changes for free final time formulation
MarlenyVega Jun 2, 2023
ee59064
Add lower inequality constraint to MTP SynX
SpencerTWilliams Jun 2, 2023
3660531
Fixed minor syntax errors
MarlenyVega Jun 5, 2023
03d4af7
Updated integrand calculation
MarlenyVega Jun 5, 2023
10f5d1d
Merge pull request #204 from rcnl-org/dev
SpencerTWilliams Jun 6, 2023
d4ad602
Fix merge conflicts
SpencerTWilliams Jun 6, 2023
1aa2376
Fix integrand merge conflict
SpencerTWilliams Jun 6, 2023
6c44c21
Restore TO integrand
SpencerTWilliams Jun 6, 2023
b3e1f70
Merge branch 'Merging-parpool-mex-into-dev' into parallel-pool-mex-al…
SpencerTWilliams Jun 6, 2023
85d52fb
Merge pull request #205 from rcnl-org/parallel-pool-mex-alternative
SpencerTWilliams Jun 6, 2023
989c808
Fix residual SynX activation allowable error
SpencerTWilliams Jun 6, 2023
46f1d95
Fixed free final time formulation
MarlenyVega Jun 6, 2023
96f8d52
Merge pull request #202 from rcnl-org/FixedSynergyDrivenFormulation
cvhammond Jun 8, 2023
8d482e4
Merge pull request #206 from rcnl-org/Merging-parpool-mex-into-dev
cvhammond Jun 8, 2023
c1429ed
Merge branch 'FreeFinalTime' into FixFreeFinalTime
MarlenyVega Jun 9, 2023
25c7f62
Merge pull request #209 from rcnl-org/FixFreeFinalTime
MarlenyVega Jun 9, 2023
7d38f24
Updated variable names in mex/matlab functions
MarlenyVega Jun 10, 2023
a2111ac
Update SynX bounds
SpencerTWilliams Jun 12, 2023
e18e260
Fix constraints for multiple trials
SpencerTWilliams Jun 12, 2023
cb392aa
Fixed ValueStruct
MarlenyVega Jun 13, 2023
dc16caa
Fix saving MTP without precal
SpencerTWilliams Jun 13, 2023
89844ce
Use excitation penalty
SpencerTWilliams Jun 13, 2023
fd378e6
fixed exception on NCP parse
cvhammond Jun 13, 2023
c9c8943
Quick fix to free final time range setup
MarlenyVega Jun 13, 2023
eeaefed
Merge branch 'FreeFinalTime' of https://github.com/rcnl-org/nmsm-core…
MarlenyVega Jun 13, 2023
07a5694
Fixed reporting of userDefinedVariables
MarlenyVega Jun 14, 2023
8c8c515
Fixed experimentalTime
MarlenyVega Jun 14, 2023
ab77936
Fixed maxIntegral in VerificationOptimization
MarlenyVega Jun 14, 2023
b55942d
Merge pull request #207 from rcnl-org/FreeFinalTime
cvhammond Jun 14, 2023
5cac387
Excitation cost allowable error and error center from xml
SpencerTWilliams Jun 14, 2023
0d70c90
Merge pull request #213 from rcnl-org/debug-mtp
cvhammond Jun 15, 2023
0d105f3
Merge pull request #214 from rcnl-org/dev
cvhammond Jun 15, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
<?xml version='1.0' encoding='UTF-8'?>
<Info Ref="src/core/TreatmentOptimization/costTerms" Type="Relative"/>
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
<?xml version='1.0' encoding='UTF-8'?>
<Info location="cc1969ad-586b-4b5c-8496-892291913346" type="Reference"/>
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
<?xml version='1.0' encoding='UTF-8'?>
<Info/>
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
<?xml version='1.0' encoding='UTF-8'?>
<Info location="1" type="DIR_SIGNIFIER"/>
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?xml version='1.0' encoding='UTF-8'?>
<Info>
<Category UUID="FileClassCategory">
<Label UUID="derived"/>
<Label UUID="design"/>
</Category>
</Info>
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
<?xml version='1.0' encoding='UTF-8'?>
<Info location="isTrackingCostTerm.m" type="File"/>
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
<?xml version='1.0' encoding='UTF-8'?>
<Info/>
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
<?xml version='1.0' encoding='UTF-8'?>
<Info location="costTerms" type="File"/>
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?xml version='1.0' encoding='UTF-8'?>
<Info>
<Category UUID="FileClassCategory">
<Label UUID="derived"/>
<Label UUID="design"/>
</Category>
</Info>
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
<?xml version='1.0' encoding='UTF-8'?>
<Info location="writeNeuralControlPersonalizationOsimxFile.m" type="File"/>
22 changes: 6 additions & 16 deletions src/DesignOptimization/DesignOptimization.m
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
% This function is part of the NMSM Pipeline, see file for full license.
%
% () -> ()
%
%

% ----------------------------------------------------------------------- %
% The NMSM Pipeline is a toolkit for model personalization and treatment %
Expand All @@ -11,7 +11,7 @@
% National Institutes of Health (R01 EB030520). %
% %
% Copyright (c) 2021 Rice University and the Authors %
% Author(s): Marleny Vega %
% Author(s): Marleny Vega, Claire V. Hammond %
% %
% Licensed under the Apache License, Version 2.0 (the "License"); %
% you may not use this file except in compliance with the License. %
Expand All @@ -26,19 +26,9 @@
% ----------------------------------------------------------------------- %

function [output, inputs] = DesignOptimization(inputs, params)
pointKinematics(inputs.mexModel);
inverseDynamics(inputs.mexModel);
inputs = getStateDerivatives(inputs);
inputs = setupGroundContact(inputs);
inputs = getSplines(inputs);
inputs = checkStateGuess(inputs);
inputs = checkControlGuess(inputs);
inputs = checkParameterGuess(inputs);
inputs = getIntegralBounds(inputs);
inputs = getPathConstraintBounds(inputs);
inputs = getTerminalConstraintBounds(inputs);
inputs = getDesignVariableInputBounds(inputs);
if strcmp(inputs.controllerType, 'synergy_driven')
inputs = makeTreatmentOptimizationInputs(inputs, params);
initializeMexOrMatlabParallelFunctions(inputs.mexModel);
if strcmp(inputs.controllerType, 'synergy_driven')
inputs = setupMuscleSynergies(inputs);
end
output = computeDesignOptimizationMainFunction(inputs, params);
Expand All @@ -47,4 +37,4 @@
inputs.splineSynergyActivations = spaps(inputs.initialGuess.time, ...
inputs.initialGuess.control(:, inputs.numCoordinates + 1:end)', 0.0000001);
inputs.synergyLabels = inputs.initialGuess.controlLabels(:, inputs.numCoordinates + 1:end);
end
end
4 changes: 2 additions & 2 deletions src/DesignOptimization/DesignOptimizationTool.m
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,6 @@ function DesignOptimizationTool(settingsFileName)
settingsTree = xml2struct(settingsFileName);
[inputs, params] = parseDesignOptimizationSettingsTree(settingsTree);
[outputs, inputs] = DesignOptimization(inputs, params);
reportDesignOptimizationResults(outputs, inputs);
reportTreatmentOptimizationResults(outputs, inputs);
saveDesignOptimizationResults(outputs, inputs);
end
end
35 changes: 6 additions & 29 deletions src/DesignOptimization/calcDesignOptimizationDiscreteObjective.m
Original file line number Diff line number Diff line change
Expand Up @@ -25,34 +25,11 @@
% permissions and limitations under the License. %
% ----------------------------------------------------------------------- %

function discrete = calcDesignOptimizationDiscreteObjective(values, params)
function discrete = calcDesignOptimizationDiscreteObjective(values, ...
modeledValues, auxdata)

discrete = [];
if isfield(params, 'discrete')
for i = 1:length(params.discrete.tracking)
costTerm = params.discrete.tracking{i};
if costTerm.isEnabled
switch costTerm.type
case "synergy_vectors"
discrete = cat(2, discrete, ...
calcTrackingCoordinateIntegrand(params, ...
values.time, values.statePositions, ...
costTerm.coordinate));
otherwise
throw(MException('', ['Cost term type ' costTerm.type ...
' does not exist for this tool.']))
end
end
end
for i = 1:length(params.discrete.minimizing)
costTerm = params.discrete.minimizing{i};
if costTerm.isEnabled
switch costTerm.type
otherwise
throw(MException('', ['Cost term type ' costTerm.type ...
' does not exist for this tool.']))
end
end
end
end
[costTermCalculations, allowedTypes] = ...
generateCostTermStruct("discrete", "DesignOptimization");
discrete = calcTreatmentOptimizationCost( ...
costTermCalculations, allowedTypes, values, modeledValues, auxdata);
end
48 changes: 9 additions & 39 deletions src/DesignOptimization/calcDesignOptimizationIntegrand.m
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
% This function is part of the NMSM Pipeline, see file for full license.
%
% () -> ()
%
%

% ----------------------------------------------------------------------- %
% The NMSM Pipeline is a toolkit for model personalization and treatment %
Expand All @@ -11,7 +11,7 @@
% National Institutes of Health (R01 EB030520). %
% %
% Copyright (c) 2021 Rice University and the Authors %
% Author(s): Marleny Vega %
% Author(s): Marleny Vega, Claire V. Hammond %
% %
% Licensed under the Apache License, Version 2.0 (the "License"); %
% you may not use this file except in compliance with the License. %
Expand All @@ -25,42 +25,12 @@
% permissions and limitations under the License. %
% ----------------------------------------------------------------------- %

function integrand = calcDesignOptimizationIntegrand(values, params, ...
phaseout)
integrand = [];
for i = 1:length(params.integral.tracking)
costTerm = params.integral.tracking{i};
if costTerm.isEnabled
switch costTerm.type
case "coordinate"
integrand = cat(2, integrand, ...
calcTrackingCoordinateIntegrand(params, ...
values.time, values.statePositions, ...
costTerm.coordinate));
case "controller"
integrand = cat(2, integrand, ...
calcTrackingControllerIntegrand(params, values, ...
costTerm.controller));
otherwise
throw(MException('', ['Cost term type ' costTerm.type ...
' does not exist for this tool.']))
end
end
end
for i = 1:length(params.integral.minimizing)
costTerm = params.integral.minimizing{i};
if costTerm.isEnabled
switch costTerm.type
case "joint_jerk"
integrand = cat(2, integrand, ...
calcMinimizingJointJerkIntegrand(values.controlJerks, ...
params, costTerm.coordinate));
otherwise
throw(MException('', ['Cost term type ' costTerm.type ...
' does not exist for this tool.']))
end
end
end
integrand = scaleToBounds(integrand, params.maxIntegral, params.minIntegral);
function integrand = calcDesignOptimizationIntegrand(values, ...
modeledValues, auxdata)
[costTermCalculations, allowedTypes] = ...
generateCostTermStruct("continuous", "DesignOptimization");
integrand = calcTreatmentOptimizationCost( ...
costTermCalculations, allowedTypes, values, modeledValues, auxdata);
integrand = integrand ./ (auxdata.maxIntegral - auxdata.minIntegral);
integrand = integrand .^ 2;
end
6 changes: 5 additions & 1 deletion src/DesignOptimization/calcDesignOptimizationObjective.m
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,12 @@
% permissions and limitations under the License. %
% ----------------------------------------------------------------------- %

function objective = calcDesignOptimizationObjective(discrete, continuous)
function objective = calcDesignOptimizationObjective(discrete, ...
continuous, finalTime, inputs)
continuousObjective = sum(continuous) / length(continuous);
if isfield(inputs, "finalTimeRange")
continuousObjective = continuousObjective / finalTime;
end
discreteObjective = sum(discrete) / length(discrete);
if isnan(discreteObjective); discreteObjective = 0; end
objective = continuousObjective + discreteObjective;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
% This function is part of the NMSM Pipeline, see file for full license.
%
% () -> ()
%
%

% ----------------------------------------------------------------------- %
% The NMSM Pipeline is a toolkit for model personalization and treatment %
Expand All @@ -25,13 +25,20 @@
% permissions and limitations under the License. %
% ----------------------------------------------------------------------- %

function phaseout = computeDesignOptimizationContinuousFunction(inputs)
function modeledValues = computeDesignOptimizationContinuousFunction(inputs)

values = getDesignOptimizationValueStruct(inputs.phase, inputs.auxdata);
phaseout = calcTorqueBasedModeledValues(values, inputs.auxdata);
phaseout = calcSynergyBasedModeledValues(values, inputs.auxdata, phaseout);
phaseout.dynamics = calcDesignOptimizationDynamicsConstraint(values, inputs.auxdata);
phaseout.path = calcDesignOptimizationPathConstraint(values, phaseout, inputs.auxdata);
phaseout.integrand = calcDesignOptimizationIntegrand(values, inputs.auxdata, ...
phaseout);
end
inputs = updateSystemFromUserDefinedFunctions(inputs, values);
modeledValues = calcTorqueBasedModeledValues(values, inputs.auxdata);
modeledValues = calcSynergyBasedModeledValues(values, inputs.auxdata, ...
modeledValues);
modeledValues.dynamics = calcDesignOptimizationDynamicsConstraint(values, ...
inputs.auxdata);
if ~isempty(inputs.auxdata.path)
modeledValues.path = calcDesignOptimizationPathConstraint(values, ...
modeledValues, inputs.auxdata);
end
modeledValues.integrand = calcDesignOptimizationIntegrand(values, ...
modeledValues, inputs.auxdata);
end

35 changes: 28 additions & 7 deletions src/DesignOptimization/computeDesignOptimizationEndpointFunction.m
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
% This function is part of the NMSM Pipeline, see file for full license.
%
% () -> ()
%
%

% ----------------------------------------------------------------------- %
% The NMSM Pipeline is a toolkit for model personalization and treatment %
Expand All @@ -11,7 +11,7 @@
% National Institutes of Health (R01 EB030520). %
% %
% Copyright (c) 2021 Rice University and the Authors %
% Author(s): Marleny Vega %
% Author(s): Marleny Vega, Claire V. Hammond %
% %
% Licensed under the Apache License, Version 2.0 (the "License"); %
% you may not use this file except in compliance with the License. %
Expand All @@ -31,14 +31,35 @@
inputs.phase.time = [inputs.phase.initialtime; inputs.phase.finaltime];
inputs.phase.control = ones(size(inputs.phase.time,1), ...
length(inputs.auxdata.minControl));
values = getDesignOptimizationValueStruct(inputs.phase, inputs.auxdata);
phase = inputs.phase;
if isfield(inputs, "parameter")
phase.parameter = inputs.parameter;
end
values = getDesignOptimizationValueStruct(phase, inputs.auxdata);
inputs = updateSystemFromUserDefinedFunctions(inputs, values);
modeledValues = calcTorqueBasedModeledValues(values, inputs.auxdata);

if ~isempty(inputs.auxdata.terminal)
output.eventgroup.event = calcDesignOptimizationTerminalConstraint( ...
values, modeledValues, inputs.auxdata);
output.eventgroup.event = calcDesignOptimizationTerminalConstraint( ...
values, modeledValues, inputs.auxdata);
end
discrete = calcDesignOptimizationDiscreteObjective(values, inputs.auxdata);
discrete = calcDesignOptimizationDiscreteObjective(values, ...
modeledValues, inputs.auxdata);
% discrete = computeStaticParameterCost(inputs);
output.objective = calcDesignOptimizationObjective(discrete, ...
inputs.phase.integral);
inputs.phase.integral, values.time(end), inputs.auxdata);
end

function cost = computeStaticParameterCost(inputs)
costTerms = inputs.auxdata.costTerms;
cost = 0;
for i = 1:length(costTerms)
costTerm = costTerms{i};
if strcmp(costTerm.type, "user_defined") && ...
strcmp(costTerm.cost_term_type, "discrete")
func = str2func(costTerm.function_name);
cost = cost + func(inputs);
end
end
end

Loading
Loading