diff --git a/.gitignore b/.gitignore index ce4825bef7e29737b9b90a911afd7dd9cfdac113..c424aedc3b5e413cdceada7a8e5499140b6225d3 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,4 @@ output8.txt simulations/logs/* .DS_Store s1_s2_simulation +output/ diff --git a/config.toml b/config.toml index 31ef4ab6dfefadaff5d2432c590476287c5f7617..7b07744f8eb7346f4dfe3ca4180db9138f031222 100644 --- a/config.toml +++ b/config.toml @@ -5,19 +5,19 @@ results_file = "results.csv" tolerance = 1 # s1 parameters -s1_min = 30 -s1_max = 34 +s1_min = 1.0e7 +s1_max = 3.0e7 # s2 parameters -s2_args = ['openCARP', '+F', '/code/openCARP-Actors/simulations/input/s1_s2.par'] -s2_min = 100 -s2_max = 500 -s2_interval_min = 250 -s2_interval_max = 250 -s2_interval_increment = 5 +s2_args = ['openCARP', '+F', '/code/simulations/input/s2.par'] +s2_min = 1.0e8 +s2_max = 3.0e8 +s2_interval_min = 185 +s2_interval_max = 205 +s2_interval_increment = 1 [petsc] [openCARP] -args = ['openCARP', '+F', '/code/openCARP-Actors/simulations/input/new_basic.par'] \ No newline at end of file +args = ['openCARP', '+F', '/code/simulations/input/s1.par'] \ No newline at end of file diff --git a/config.yaml b/config.yaml deleted file mode 100644 index 0bb9447013d747ccecb45bc4a77b301f27301e6a..0000000000000000000000000000000000000000 --- a/config.yaml +++ /dev/null @@ -1,7 +0,0 @@ -# Configuration File for openCARP-Actors -# This file helps assemble the openCARP command line arguments - - -some_val: - - 1 - - 2 \ No newline at end of file diff --git a/environment_setup/Dockerfile b/environment_setup/Dockerfile index 0eb6ef63c24e1fa2d1d94977add13ee237a0893d..d488dc3fdac53e9709bbc02ac8fc4ea3efb94c60 100755 --- a/environment_setup/Dockerfile +++ b/environment_setup/Dockerfile @@ -59,10 +59,16 @@ RUN cmake .. RUN make RUN make install +# Install TOML +WORKDIR /opt +RUN git clone https://github.com/marzer/tomlplusplus.git + + # Install OpenCARP From Numerical Simulations WORKDIR /opt RUN git clone https://git.cs.usask.ca/numerical_simulations_lab/cardiac/openCARP.git WORKDIR /opt/openCARP +RUN git checkout develop RUN cmake -S. -B_build -DDLOPEN=ON -DCMAKE_BUILD_TYPE=Debug RUN cmake --build _build @@ -78,21 +84,6 @@ ENV PATH=$PATH:/opt/openCARP/_build/bin RUN python3 ./bin/cusettings $HOME/.config/carputils/settings.yaml ADD settings.yaml /root/.config/carputils/ -# Install YAML -# WORKDIR /opt -# RUN git clone https://github.com/jbeder/yaml-cpp.git -# WORKDIR /opt/yaml-cpp -# RUN mkdir build -# WORKDIR /opt/yaml-cpp/build -# RUN cmake .. -# RUN make -# RUN make install - -# Install TOML -WORKDIR /opt -RUN git clone https://github.com/marzer/tomlplusplus.git - - # Set entrypoint WORKDIR /code diff --git a/find_s1.py b/legacy_scripts/find_s1.py similarity index 100% rename from find_s1.py rename to legacy_scripts/find_s1.py diff --git a/find_s2.py b/legacy_scripts/find_s2.py similarity index 50% rename from find_s2.py rename to legacy_scripts/find_s2.py index 2d774741ceb7aa2a4a917767c33cff664fb64adb..ec303782b9fe7c1535c112eb831caaf4171d5222 100644 --- a/find_s2.py +++ b/legacy_scripts/find_s2.py @@ -62,7 +62,7 @@ def run(args, job): #=========================================== # Create a block with a thin z dimension - x = 10.0 #(mm) + x = 1.0 #(mm) y = 1.0 #(mm) z = 0.2 #(mm) geom = mesh.Block(size=(x,y,z)) @@ -73,61 +73,61 @@ def run(args, job): # Finilaize the creation of the mesh meshname = mesh.generate(geom) - #=========================================== - # 2: Define the ionic models & conductivities - #=========================================== - - # Query for element labels - _, etags, _ = txt.read(meshname + '.elem') - etags = np.unique(etags) - - IntraTags = etags[etags != 0].tolist() - ExtraTags = etags.tolist().copy() - - #=========================================== - # 3: Configure the simulation - #=========================================== - - # Define the geometry of the stimulus at one end of the block - # Units are um - stim = ['-num_stim', 2, - '-stimulus[0].name', 'S1', #index 0 because only one type of electrode - '-stimulus[0].stimtype', 0, #0 means intracellular stim - '-stimulus[0].strength', args.S1_strength, #uA/Cm^2 - '-stimulus[0].duration', args.S1_dur, - '-stimulus[0].start', args.S1_start, - '-stimulus[1].name', 'S2', - '-stimulus[1].stimtype', 0, - '-stimulus[1].strength', args.S2_strength, - '-stimulus[1].duration', args.S2_dur, - '-stimulus[1].start', args.S2_start] - - #electrode = mesh.block_boundary_condition(geom, 'stimulus', 0, 'x', True) #True refers to a BC between tissue and bath - E1_lower_bound = nplist([ 0.0, 0.0, 0.0]) - E1_upper_bound = nplist([ 2.0, 0.3, 0.2]) - electrode = mesh.block_region(geom, 'stimulus', 0, E1_lower_bound, E1_upper_bound, False) # introudce a stimulus in the region defined by the lower and upper bounds - - #electrode = mesh.block_boundary_condition(geom, 'stimulus', 0, 'x', True) #True refers to a BC between tissue and bath - E1_lower_bound = nplist([ 0.0, 0.0, 0.0]) - E1_upper_bound = nplist([ 2.0, 0.3, 0.2]) - electrode = mesh.block_region(geom, 'stimulus', 0, E1_lower_bound, E1_upper_bound, False) # introudce a stimulus in the region defined by the lower and upper bounds - - #=========================================== - # 4: Defining simulator options: - #=========================================== - - # Get basic command line, including solver options - cmd = tools.carp_cmd(os.path.join('simulations/input/basic.par')) #cmd is a carp command - - cmd += ['-simID', job.ID, - '-meshname', meshname, - '-dt', 25, - '-tend', args.duration] - cmd += tools.gen_physics_opts(ExtraTags=ExtraTags, IntraTags=IntraTags) - cmd += stim + electrode - - # Run simulation - print(cmd) - job.carp(cmd) #cmd includes the params + # #=========================================== + # # 2: Define the ionic models & conductivities + # #=========================================== + + # # Query for element labels + # _, etags, _ = txt.read(meshname + '.elem') + # etags = np.unique(etags) + + # IntraTags = etags[etags != 0].tolist() + # ExtraTags = etags.tolist().copy() + + # #=========================================== + # # 3: Configure the simulation + # #=========================================== + + # # Define the geometry of the stimulus at one end of the block + # # Units are um + # stim = ['-num_stim', 2, + # '-stimulus[0].name', 'S1', #index 0 because only one type of electrode + # '-stimulus[0].stimtype', 0, #0 means intracellular stim + # '-stimulus[0].strength', args.S1_strength, #uA/Cm^2 + # '-stimulus[0].duration', args.S1_dur, + # '-stimulus[0].start', args.S1_start, + # '-stimulus[1].name', 'S2', + # '-stimulus[1].stimtype', 0, + # '-stimulus[1].strength', args.S2_strength, + # '-stimulus[1].duration', args.S2_dur, + # '-stimulus[1].start', args.S2_start] + + # #electrode = mesh.block_boundary_condition(geom, 'stimulus', 0, 'x', True) #True refers to a BC between tissue and bath + # E1_lower_bound = nplist([ 0.0, 0.0, 0.0]) + # E1_upper_bound = nplist([ 2.0, 0.3, 0.2]) + # electrode = mesh.block_region(geom, 'stimulus', 0, E1_lower_bound, E1_upper_bound, False) # introudce a stimulus in the region defined by the lower and upper bounds + + # #electrode = mesh.block_boundary_condition(geom, 'stimulus', 0, 'x', True) #True refers to a BC between tissue and bath + # E1_lower_bound = nplist([ 0.0, 0.0, 0.0]) + # E1_upper_bound = nplist([ 2.0, 0.3, 0.2]) + # electrode = mesh.block_region(geom, 'stimulus', 0, E1_lower_bound, E1_upper_bound, False) # introudce a stimulus in the region defined by the lower and upper bounds + + # #=========================================== + # # 4: Defining simulator options: + # #=========================================== + + # # Get basic command line, including solver options + # cmd = tools.carp_cmd(os.path.join('simulations/input/basic.par')) #cmd is a carp command + + # cmd += ['-simID', job.ID, + # '-meshname', meshname, + # '-dt', 25, + # '-tend', args.duration] + # cmd += tools.gen_physics_opts(ExtraTags=ExtraTags, IntraTags=IntraTags) + # cmd += stim + electrode + + # # Run simulation + # print(cmd) + # job.carp(cmd) #cmd includes the params run() \ No newline at end of file diff --git a/main.cpp b/legacy_scripts/main.cpp similarity index 100% rename from main.cpp rename to legacy_scripts/main.cpp diff --git a/src/main.cpp b/legacy_scripts/src/main.cpp similarity index 100% rename from src/main.cpp rename to legacy_scripts/src/main.cpp diff --git a/results.csv b/results.csv new file mode 100644 index 0000000000000000000000000000000000000000..5499adf4df0ad2f6f17dc334cb47af9324f377fb --- /dev/null +++ b/results.csv @@ -0,0 +1 @@ +s1_strength,s2_sim_time,s2_strength diff --git a/simulations/input/basic.par b/simulations/input/basic.par deleted file mode 100644 index f10318b3925646ca5cce1f36054ed79649041543..0000000000000000000000000000000000000000 --- a/simulations/input/basic.par +++ /dev/null @@ -1,18 +0,0 @@ -# ionic setup -num_imp_regions = 1 - -imp_region[0].im = DrouhardRoberge - -#electrical setup -num_stim = 1 - -stimulus[0].name = "S1" -stimulus[0].stimtype = 0 -stimulus[0].strength = 250.0 -stimulus[0].duration = 2. -stimulus[0].start = 0. - -bidomain = 0 -spacedt = 1. -timedt = 1. -parab_solve = 1 diff --git a/simulations/input/generate_mesh.py b/simulations/input/generate_mesh.py new file mode 100644 index 0000000000000000000000000000000000000000..ce56306f2ab31be586895c2cc0453a15199f92f9 --- /dev/null +++ b/simulations/input/generate_mesh.py @@ -0,0 +1,138 @@ +#!/usr/bin/env python + +""" +This is the setup for the S1S2 Actors study. + +""" +import os +EXAMPLE_DESCRIPTIVE_NAME = 'S1-S2 Actors Simulation' +EXAMPLE_AUTHOR = 'Joyce Reimer <joyce.reimer@usask.ca>' +EXAMPLE_DIR = os.path.dirname(__file__) +GUIinclude = True + +import sys +from datetime import date + +from carputils import settings +from carputils import tools +from carputils import mesh +import numpy as np +from numpy import array as nplist + +def parser(): + parser = tools.standard_parser() + group = parser.add_argument_group('experiment specific options') + group.add_argument('--duration', + type = float, + default = 300., + help = 'Duration of simulation in [ms]') + group.add_argument('--S1-strength', + type = float, + default = 0., + help = 'pick S1 extracellular current stimulus strength in [uA/cm^3]') + group.add_argument('--S1-dur', + type = float, + default = 2., + help = 'pick S1 current stimulus duration in [ms] (default: 2.)') + group.add_argument('--S1-start', + type = float, + default = 0.0, + help = 'pick S1 start time') + group.add_argument('--S2-strength', + type = float, + default = 0., + help = 'pick S2 extracellular current stimulus strength in [uA/cm^3]') + group.add_argument('--S2-dur', + type = float, + default = 2., + help = 'pick S2 current stimulus duration in [ms] (default: 2.)') + group.add_argument('--S2-start', + type = float, + default = 235.0, + help = 'pick S2 start time') + + return parser + +def jobID(args): + """ + Generate name of top level output directory. + """ + today = date.today() + return '{}_XCstim_{}_np{}'.format(today.isoformat(), + args.flv, args.np) + +@tools.carpexample(parser, jobID) +def run(args, job): + + # Generate mesh + # Block which is thin in z direction + geom = mesh.Block(size=(10.0, 10.0, 2.0)) #in mm + #geom = mesh.Block(size=(1.0, 1.0, 2.0)) #in mm + # Set fibre angle to 0, sheet angle to 0 + geom.set_fibres(0, 0, 90, 90) + geom.corner_at_origin() + # Generate and return base name + meshname = mesh.generate(geom) + + # # define electrode locations + # #Test electrode is in bottom left corner. Has the same area as our experimental data + # # and has a z-thickness the size of dx. + + # E1_lower_bound = nplist([ 0.0, 0.0, 2.0]) #in mm + # E2_lower_bound = nplist([ 0.0, 0.0, 2.0]) + # # Last number should always be z thickness; first two numbers should be 0 if corner at origin. + + # E1_upper_bound = nplist([ 0.175, 0.175, 2.0]) #in mm + # E2_upper_bound = nplist([ 0.175, 0.175, 2.0]) #in mm + # #With these dimensions and default resolution of 0.1mm, we get electrode area = .225 x .225 = 0.05 mm^2. + # #Last number should always be z thickness. + + # #S1 and S2 electrodes: + # lstm = mesh.block_region(geom, 'stimulus', 0, E1_lower_bound, E1_upper_bound, False) + # lstm2 = mesh.block_region(geom, 'stimulus', 1, E2_lower_bound, E2_upper_bound, False) + + + # #Reference/ground electrode is behind domain. + # rstm = mesh.block_boundary_condition(geom, 'stimulus', 2, 'z', lower=True, verbose=not args.silent) + + + # del geom + + # #astm = [] + # #mod = [] + + # # tags generated with the above command + # IntraTags = [1] + # ExtraTags = [1] + + # lstm += ['-stimulus[0].stimtype', '1', + # '-stimulus[0].strength', args.S1_strength, #3e7 uA/cm^3 worked + # '-stimulus[0].duration', args.S1_dur, + # '-stimulus[0].start', args.S1_start] + # lstm2 +=['-stimulus[1].stimtype', '1', + # '-stimulus[1].strength', args.S2_strength, + # '-stimulus[1].duration', args.S2_dur, + # '-stimulus[1].start', args.S2_start] + + + # # Add all the non-general arguments + # cmd = tools.carp_cmd(os.path.join(EXAMPLE_DIR, 'stimtest-og.par')) + + # cmd += ['-meshname', meshname, + # '-simID', job.ID, + # '-tend', args.duration] + # cmd += tools.gen_physics_opts(ExtraTags=ExtraTags, IntraTags=IntraTags) + + # # add PDE solver options + # cmd += lstm + lstm2 + rstm + + # if args.visualize: + # cmd += ['-gridout_i', 3, + # '-gridout_e', 3] + + # # Run simulations + # job.carp(cmd) + + +if __name__ == '__main__': + run() \ No newline at end of file diff --git a/simulations/input/s1.par b/simulations/input/s1.par new file mode 100644 index 0000000000000000000000000000000000000000..5ee6d4d5025a9ed14dada07a6f876a4e76ca05d3 --- /dev/null +++ b/simulations/input/s1.par @@ -0,0 +1,77 @@ +#Parameters file for the S1-S2 Actors Study +#mesh parameters (these parameters get passed to mesher when the Python script is run. Hopefully +# openCARP automatically does this when only using the .par file.) +meshname = /code/simulations/input/meshes/2023-08-15_XAOClJVdTF/block +#physical regions +num_phys_regions = 2 +phys_region[0].name = "Intracellular domain" +phys_region[0].ptype = 0 +phys_region[0].num_IDs = 1 +phys_region[0].ID[0] = 1 +phys_region[1].name = "Extracellular domain" +phys_region[1].ptype = 1 +phys_region[1].num_IDs = 1 +phys_region[1].ID[0] = 1 +# ionic setup +num_imp_regions = 1 +imp_region[0].im = Shannon +#stimulus setup +num_stim = 3 +stimulus[0].name = "S1" +stimulus[0].stimtype = 1 +stimulus[0].duration = 2. +stimulus[0].start = 0. +stimulus[0].npls = 1 +stimulus[0].x0 = -50.0 #in um +stimulus[0].xd = 275.0 #thickness in um +stimulus[0].y0 = -50.0 +stimulus[0].yd = 275.0 +stimulus[0].z0 = 1950.0 +stimulus[0].zd = 100.0 +# stimulus[1].name = "S2" +# stimulus[1].stimtype = 1 +# stimulus[1].duration = 2. +# stimulus[1].npls = 1 +# stimulus[1].x0 = -50.0 +# stimulus[1].xd = 275.0 +# stimulus[1].y0 = -50.0 +# stimulus[1].yd = 275.0 +# stimulus[1].z0 = 1950.0 +# stimulus[1].zd = 100.0 +stimulus[2].name = "Ground" +stimulus[2].stimtype = 3 +stimulus[2].x0 = -50.0 +stimulus[2].xd = 10100.0 +stimulus[2].y0 = -50.0 +stimulus[2].yd = 10100.0 +stimulus[2].z0 = -50.0 +stimulus[2].zd = 100.0 +#Simulation parameters +bidomain = 1 +tend = 300. +spacedt = 1.0 +timedt = 1.0 +parab_solve = 1 +#S1-S2 script params to start with: +#S1 min = 1.0e7 +#S1 max = 3.0e7 +#(Actual S1 threshold = 28,167,114) +#Absolute S2 max = 3.0e8 (could go higher if needed, it depends when the solution blows up.) +#S1S2_interval_min=185 +#S1S2_interval_max=205 (If it is still refractory here, we can extend the range. If it is not, +# we can extend it in the other direction by lowering min.) +#S1S2_interval_increment=1 +#This interval range is subject to change...I have it so that we find 20 data points, +#but I don't know what the proper min and max is for this setup yet. +#tol = 1 +#So far I have tolerance at 1, but because we are working on a much larger scale, we could probably +#increase this number quite a bit if needed. +#Sample points - 2 in bottom left, 2 in bottom right, 2 close to centre, 4 in top left, 4 in top right. +#E.g.: Bottom Left = (2, 2, 0.5), (2, 2, 1.5) +# Bottom Right = (8, 8, 0.5), (8, 8, 1.5) +# Centre = (3.5, 5, 0.5), (6.5, 5, 1.5) +# Top Left = (0, 10, 0.5), (0, 10, 1.5), (0.5, 9.5, 0.25), (0.5, 9.5, 1.75) +# Top Right = (10, 10, 0.5), (10, 10, 1.5), (9.5, 9.5, 0.25), (9.5, 9.5, 1.75) +# These are somewhat arbitrary, we will need to test these out and see how they go. +# Also, it is unlikely that these exact coordinates are vertices. This is okay, however, in the paper, +# we should put what the actual coordinates are. \ No newline at end of file diff --git a/simulations/input/s2.par b/simulations/input/s2.par new file mode 100644 index 0000000000000000000000000000000000000000..df80dc275f8981578873e3a80eae320bcfd9bcaf --- /dev/null +++ b/simulations/input/s2.par @@ -0,0 +1,78 @@ +#Parameters file for the S1-S2 Actors Study +#mesh parameters (these parameters get passed to mesher when the Python script is run. Hopefully +# openCARP automatically does this when only using the .par file.) + +meshname = /code/simulations/input/meshes/2023-08-15_XAOClJVdTF/block +#physical regions +num_phys_regions = 2 +phys_region[0].name = "Intracellular domain" +phys_region[0].ptype = 0 +phys_region[0].num_IDs = 1 +phys_region[0].ID[0] = 1 +phys_region[1].name = "Extracellular domain" +phys_region[1].ptype = 1 +phys_region[1].num_IDs = 1 +phys_region[1].ID[0] = 1 +# ionic setup +num_imp_regions = 1 +imp_region[0].im = Shannon +#stimulus setup +num_stim = 3 +stimulus[0].name = "S1" +stimulus[0].stimtype = 1 +stimulus[0].duration = 2. +stimulus[0].start = 0. +stimulus[0].npls = 1 +stimulus[0].x0 = -50.0 #in um +stimulus[0].xd = 275.0 #thickness in um +stimulus[0].y0 = -50.0 +stimulus[0].yd = 275.0 +stimulus[0].z0 = 1950.0 +stimulus[0].zd = 100.0 +stimulus[1].name = "S2" +stimulus[1].stimtype = 1 +stimulus[1].duration = 2. +stimulus[1].npls = 1 +stimulus[1].x0 = -50.0 +stimulus[1].xd = 275.0 +stimulus[1].y0 = -50.0 +stimulus[1].yd = 275.0 +stimulus[1].z0 = 1950.0 +stimulus[1].zd = 100.0 +stimulus[2].name = "Ground" +stimulus[2].stimtype = 3 +stimulus[2].x0 = -50.0 +stimulus[2].xd = 10100.0 +stimulus[2].y0 = -50.0 +stimulus[2].yd = 10100.0 +stimulus[2].z0 = -50.0 +stimulus[2].zd = 100.0 +#Simulation parameters +bidomain = 1 +tend = 300. +spacedt = 1.0 +timedt = 1.0 +parab_solve = 1 +#S1-S2 script params to start with: +#S1 min = 1.0e7 +#S1 max = 3.0e7 +#(Actual S1 threshold = 28,167,114) +#Absolute S2 max = 3.0e8 (could go higher if needed, it depends when the solution blows up.) +#S1S2_interval_min=185 +#S1S2_interval_max=205 (If it is still refractory here, we can extend the range. If it is not, +# we can extend it in the other direction by lowering min.) +#S1S2_interval_increment=1 +#This interval range is subject to change...I have it so that we find 20 data points, +#but I don't know what the proper min and max is for this setup yet. +#tol = 1 +#So far I have tolerance at 1, but because we are working on a much larger scale, we could probably +#increase this number quite a bit if needed. +#Sample points - 2 in bottom left, 2 in bottom right, 2 close to centre, 4 in top left, 4 in top right. +#E.g.: Bottom Left = (2, 2, 0.5), (2, 2, 1.5) +# Bottom Right = (8, 8, 0.5), (8, 8, 1.5) +# Centre = (3.5, 5, 0.5), (6.5, 5, 1.5) +# Top Left = (0, 10, 0.5), (0, 10, 1.5), (0.5, 9.5, 0.25), (0.5, 9.5, 1.75) +# Top Right = (10, 10, 0.5), (10, 10, 1.5), (9.5, 9.5, 0.25), (9.5, 9.5, 1.75) +# These are somewhat arbitrary, we will need to test these out and see how they go. +# Also, it is unlikely that these exact coordinates are vertices. This is okay, however, in the paper, +# we should put what the actual coordinates are. \ No newline at end of file diff --git a/simulations/input/new_basic.par b/simulations/input/tests/new_basic.par similarity index 96% rename from simulations/input/new_basic.par rename to simulations/input/tests/new_basic.par index 37f789c1e4490c12a8de0638923aae3b300f1d08..9a47479eb5ca479dc54429c4e1f1d88273b6b750 100644 --- a/simulations/input/new_basic.par +++ b/simulations/input/tests/new_basic.par @@ -8,7 +8,7 @@ simID = Test_Output/34 # Meshname # ---------------------------------------- -meshname = /code/openCARP-Actors/meshes/2023-06-30_TgWObjAUlq/block +meshname = /code/meshes/2023-08-15_yqZkjFbniY/block # ---------------------------------------- # Definition of physics region diff --git a/simulations/input/s1_s2.par b/simulations/input/tests/s1_s2.par similarity index 96% rename from simulations/input/s1_s2.par rename to simulations/input/tests/s1_s2.par index cd75de6ffb7b3b0def8afa3366d08504232f9a0f..9a47230142690dbe233e2fecb5325e48f3d6c5a3 100644 --- a/simulations/input/s1_s2.par +++ b/simulations/input/tests/s1_s2.par @@ -8,7 +8,7 @@ simID = output/ # Meshname # ---------------------------------------- -meshname = /code/openCARP-Actors/meshes/2023-06-30_TgWObjAUlq/block +meshname = /code/meshes/2023-08-15_yqZkjFbniY/block # ---------------------------------------- # Definition of physics region diff --git a/yaml-cpp b/yaml-cpp deleted file mode 160000 index b8882652fcbeba4c00dec019a39da91e702e474e..0000000000000000000000000000000000000000 --- a/yaml-cpp +++ /dev/null @@ -1 +0,0 @@ -Subproject commit b8882652fcbeba4c00dec019a39da91e702e474e