...
 
Commits (36)
......@@ -126,7 +126,7 @@ buildDockerMXNet150:
- shell
script:
- cd src/test/resources/docker/mxnet150
# - docker login registry.git.rwth-aachen.de -u someUserName -p yEep-tAt19HbsmNQJMNo
- docker login registry.git.rwth-aachen.de -u someUserName -p yEep-tAt19HbsmNQJMNo
- docker build -t registry.git.rwth-aachen.de/monticore/embeddedmontiarc/generators/emadl2cpp/dockerimages/mxnet150:v0.0.5 .
- docker push registry.git.rwth-aachen.de/monticore/embeddedmontiarc/generators/emadl2cpp/dockerimages/mxnet150:v0.0.5
only:
......@@ -139,7 +139,7 @@ buildDockerMXNet170:
- shell
script:
- cd src/test/resources/docker/mxnet170
# - docker login registry.git.rwth-aachen.de -u someUserName -p yEep-tAt19HbsmNQJMNo
- docker login registry.git.rwth-aachen.de -u someUserName -p yEep-tAt19HbsmNQJMNo
- docker build -t registry.git.rwth-aachen.de/monticore/embeddedmontiarc/generators/emadl2cpp/dockerimages/mxnet170:v0.0.1 .
- docker push registry.git.rwth-aachen.de/monticore/embeddedmontiarc/generators/emadl2cpp/dockerimages/mxnet170:v0.0.1
only:
......
......@@ -9,7 +9,7 @@
<groupId>de.monticore.lang.monticar</groupId>
<artifactId>embedded-montiarc-emadl-generator</artifactId>
<version>0.4.2</version>
<version>0.4.6</version>
<!-- == PROJECT DEPENDENCIES ============================================= -->
......@@ -25,7 +25,7 @@
<cnnarch-gluon-generator.version>0.4.0-SNAPSHOT</cnnarch-gluon-generator.version>
<cnnarch-tensorflow-generator.version>0.4.0-SNAPSHOT</cnnarch-tensorflow-generator.version>
<Common-MontiCar.version>0.2.12-SNAPSHOT</Common-MontiCar.version>
<embedded-montiarc-math-generator.version>0.4.0-SNAPSHOT</embedded-montiarc-math-generator.version>
<embedded-montiarc-math-generator.version>0.4.3</embedded-montiarc-math-generator.version>
<!-- .. Libraries .................................................. -->
<guava.version>25.1-jre</guava.version>
......
......@@ -4,6 +4,7 @@ package de.monticore.lang.monticar.emadl.generator;
import de.monticore.ModelingLanguageFamily;
import de.monticore.io.paths.ModelPath;
import de.monticore.lang.embeddedmontiarc.LogConfig;
import de.monticore.lang.embeddedmontiarc.embeddedmontiarcmath._symboltable.EmbeddedMontiArcMathLanguage;
import de.monticore.lang.embeddedmontiarc.helper.ConstantPortHelper;
import de.monticore.lang.monticar.emadl._symboltable.EMADLLanguage;
import de.monticore.lang.monticar.emadl.tagging.dltag.DataPathTagSchema;
......@@ -54,6 +55,7 @@ public class EMADLAbstractSymtab {
EMADLLanguage montiArcLanguage = new EMADLLanguage();
fam.addModelingLanguage(montiArcLanguage);
fam.addModelingLanguage(new EmbeddedMontiArcMathLanguage());
fam.addModelingLanguage(new StreamUnitsLanguage());
fam.addModelingLanguage(new StructLanguage());
fam.addModelingLanguage(new EnumLangLanguage());
......
......@@ -32,10 +32,7 @@ import de.monticore.lang.monticar.generator.FileContent;
import de.monticore.lang.monticar.generator.MathCommandRegister;
import de.monticore.lang.monticar.generator.cmake.CMakeConfig;
import de.monticore.lang.monticar.generator.cmake.CMakeFindModule;
import de.monticore.lang.monticar.generator.cpp.ArmadilloHelper;
import de.monticore.lang.monticar.generator.cpp.GeneratorCPP;
import de.monticore.lang.monticar.generator.cpp.SimulatorIntegrationHelper;
import de.monticore.lang.monticar.generator.cpp.TypesGeneratorCPP;
import de.monticore.lang.monticar.generator.cpp.*;
import de.monticore.lang.monticar.generator.cpp.converter.TypeConverter;
import de.monticore.lang.monticar.generator.pythonwrapper.GeneratorPythonWrapperFactory;
import de.monticore.lang.monticar.generator.pythonwrapper.GeneratorPythonWrapperStandaloneApi;
......@@ -43,11 +40,13 @@ import de.monticore.lang.monticar.generator.pythonwrapper.symbolservices.data.Co
import de.monticore.lang.tagging._symboltable.TagSymbol;
import de.monticore.lang.tagging._symboltable.TaggingResolver;
import de.monticore.symboltable.Scope;
import de.se_rwth.commons.Names;
import de.se_rwth.commons.Splitters;
import de.se_rwth.commons.logging.Log;
import freemarker.template.TemplateException;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.SystemUtils;
import javax.xml.bind.DatatypeConverter;
import java.io.*;
import java.nio.charset.Charset;
import java.nio.file.Files;
......@@ -62,7 +61,7 @@ import java.util.stream.Collectors;
public class EMADLGenerator implements EMAMGenerator {
private boolean generateCMake = true;
private boolean generateCMake = false;
private CMakeConfig cMakeConfig = new CMakeConfig("");
private GeneratorCPP emamGen;
private CNNArchGenerator cnnArchGenerator;
......@@ -125,12 +124,20 @@ public class EMADLGenerator implements EMAMGenerator {
generateFiles(symtab, instance, pythonPath, forced);
if (doCompile) {
if (!generateCMake) // do it either way
generateCMakeFiles(instance);
compile();
}
processedArchitecture = null;
}
private EMAComponentInstanceSymbol resolveComponentInstanceSymbol(String qualifiedName, TaggingResolver symtab) {
String simpleName = Names.getSimpleName(qualifiedName);
if (!Character.isUpperCase(simpleName.charAt(0))) {
String packageName = qualifiedName.substring(0, qualifiedName.length() - simpleName.length() - 1);
qualifiedName = Names.getQualifiedName(packageName, StringUtils.capitalize(simpleName));
}
EMAComponentSymbol component = symtab.<EMAComponentSymbol>resolve(qualifiedName, EMAComponentSymbol.KIND).orElse(null);
List<String> splitName = Splitters.DOT.splitToList(qualifiedName);
......@@ -151,7 +158,11 @@ public class EMADLGenerator implements EMAMGenerator {
public void compile() throws IOException {
File tempScript = createTempScript();
try {
ProcessBuilder pb = new ProcessBuilder("bash", tempScript.toString());
ProcessBuilder pb;
if (!SystemUtils.IS_OS_WINDOWS)
pb = new ProcessBuilder("bash", tempScript.toString());
else
pb = new ProcessBuilder("cmd", tempScript.toString());
pb.inheritIO();
Process process = pb.start();
int returnCode = process.waitFor();
......@@ -169,21 +180,41 @@ public class EMADLGenerator implements EMAMGenerator {
public File createTempScript() throws IOException{
File tempScript = File.createTempFile("script", null);
try{
Writer streamWriter = new OutputStreamWriter(new FileOutputStream(
tempScript));
PrintWriter printWriter = new PrintWriter(streamWriter);
printWriter.println("#!/bin/bash");
printWriter.println("cd " + getGenerationTargetPath());
printWriter.println("mkdir -p build");
printWriter.println("cd build");
printWriter.println("cmake ..");
printWriter.println("make");
printWriter.close();
}catch(Exception e){
System.out.println(e);
if (!SystemUtils.IS_OS_WINDOWS) {
try {
Writer streamWriter = new OutputStreamWriter(new FileOutputStream(
tempScript));
PrintWriter printWriter = new PrintWriter(streamWriter);
printWriter.println("#!/bin/bash");
printWriter.println("cd " + getGenerationTargetPath());
printWriter.println("mkdir -p build");
printWriter.println("cd build");
printWriter.println("rm -r -f *");
printWriter.println("cmake ..");
printWriter.println("make");
printWriter.close();
} catch (Exception e) {
System.out.println(e);
}
} else {
try {
Writer streamWriter = new OutputStreamWriter(new FileOutputStream(
tempScript));
PrintWriter printWriter = new PrintWriter(streamWriter);
printWriter.println("cd " + getGenerationTargetPath());
printWriter.println("if exist build del /F /Q /S build");
printWriter.println("mkdir build");
printWriter.println("cd build");
printWriter.println("cmake ..");
printWriter.println("cmake --build . --config release");
printWriter.close();
} catch (Exception e) {
System.out.println(e);
}
}
return tempScript;
......@@ -198,12 +229,20 @@ public class EMADLGenerator implements EMAMGenerator {
md5.update(Files.readAllBytes(wiki_path));
byte[] digest = md5.digest();
return DatatypeConverter.printHexBinary(digest).toUpperCase();
return hex(digest);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
return "No_Such_Algorithm_Exception";
}
}
public static String hex(byte[] bytes) {
StringBuilder result = new StringBuilder();
for (byte aByte : bytes) {
result.append(String.format("%02X", aByte));
}
return result.toString();
}
public String getChecksumForLargerFile(String filePath) throws IOException {
try {
......@@ -218,6 +257,9 @@ public class EMADLGenerator implements EMAMGenerator {
Set<EMAComponentInstanceSymbol> allInstances = new HashSet<>();
List<FileContent> fileContents = generateStrings(taggingResolver, EMAComponentSymbol, allInstances, forced);
List<File> generatedFiles = new ArrayList<>();
System.out.println("Generating Adapters");
emamGen.generateAdapters(fileContents, EMAComponentSymbol);
for (FileContent fileContent : fileContents) {
generatedFiles.add(emamGen.generateFile(fileContent));
......@@ -391,11 +433,20 @@ public class EMADLGenerator implements EMAMGenerator {
}
List<FileContent> fileContents = new ArrayList<>();
// Add Helpers
if (emamGen.usesArmadilloBackend()) {
fileContents.add(ArmadilloHelper.getArmadilloHelperFileContent());
}
emamGen.searchForCVEverywhere(componentInstanceSymbol, taggingResolver);
if (emamGen.isGenerateCV) {
fileContents.add(ConversionHelper.getConversionHelperFileContent(emamGen.isGenerateTests()));
}
processedArchitecture = new HashMap<>();
generateComponent(fileContents, allInstances, taggingResolver, componentInstanceSymbol);
String instanceName = componentInstanceSymbol.getComponentType().getFullName().replaceAll("\\.", "_");
fileContents.addAll(generateCNNTrainer(allInstances, instanceName));fileContents.add(ArmadilloHelper.getArmadilloHelperFileContent());
fileContents.addAll(generateCNNTrainer(allInstances, instanceName));
TypesGeneratorCPP tg = new TypesGeneratorCPP();
fileContents.addAll(tg.generateTypes(TypeConverter.getTypeSymbols()));
......@@ -858,28 +909,23 @@ public class EMADLGenerator implements EMAMGenerator {
}
private void mergeCMakeConfigs() {
List<String> cmakeCommandList = emamGen.getCMakeConfig().getCMakeListsViewModel().getCmakeCommandList();
List<String> cmakeCommandListEnd = emamGen.getCMakeConfig().getCMakeListsViewModel().getCmakeCommandListEnd();
List<String> cmakeLibraryLinkageList = emamGen.getCMakeConfig().getCMakeListsViewModel().getCmakeLibraryLinkageList();
LinkedHashSet<CMakeFindModule> moduleDependencies = emamGen.getCMakeConfig().getCMakeListsViewModel().getModuleDependencies();
// merge
emamGen.getCmakeConfig().getCMakeListsViewModel().getCmakeCommandList()
.stream().forEach(s -> cMakeConfig.addCMakeCommand(s));
emamGen.getCmakeConfig().getCMakeListsViewModel().getCmakeCommandListEnd()
.stream().forEach(s -> cMakeConfig.addCMakeCommandEnd(s));
emamGen.getCmakeConfig().getCMakeListsViewModel().getCmakeLibraryLinkageList()
.stream().forEach(s -> cMakeConfig.addCmakeLibraryLinkage(s));
emamGen.getCmakeConfig().getCMakeListsViewModel().getModuleDependencies()
.stream().forEach(s -> cMakeConfig.addModuleDependency(s));
cnnArchGenerator.getCmakeConfig().getCMakeListsViewModel().getCmakeCommandList()
.stream().filter(s -> !cmakeCommandList.contains(s))
.forEach(s -> cmakeCommandList.add(s));
.stream().forEach(s -> cMakeConfig.addCMakeCommand(s));
cnnArchGenerator.getCmakeConfig().getCMakeListsViewModel().getCmakeCommandListEnd()
.stream().filter(s -> !cmakeCommandListEnd.contains(s))
.forEach(s -> cmakeCommandListEnd.add(s));
.stream().forEach(s -> cMakeConfig.addCMakeCommandEnd(s));
cnnArchGenerator.getCmakeConfig().getCMakeListsViewModel().getCmakeLibraryLinkageList()
.stream().filter(s -> !cmakeLibraryLinkageList.contains(s))
.forEach(s -> cmakeLibraryLinkageList.add(s));
.stream().forEach(s -> cMakeConfig.addCmakeLibraryLinkage(s));
cnnArchGenerator.getCmakeConfig().getCMakeListsViewModel().getModuleDependencies()
.stream().filter(s -> !moduleDependencies.contains(s))
.forEach(s -> moduleDependencies.add(s));
cMakeConfig.getCMakeListsViewModel().setCmakeCommandList(cmakeCommandList);
cMakeConfig.getCMakeListsViewModel().setCmakeCommandListEnd(cmakeCommandListEnd);
cMakeConfig.getCMakeListsViewModel().setCmakeLibraryLinkageList(cmakeLibraryLinkageList);
cMakeConfig.getCMakeListsViewModel().setModuleDependencies(moduleDependencies);
.stream().forEach(s -> cMakeConfig.addModuleDependency(s));
}
@Override
......
/* (c) https://github.com/MontiCore/monticore */
package de.monticore.lang.monticar.emadl.generator;
import de.monticore.lang.monticar.generator.cpp.GeneratorCPP;
import de.se_rwth.commons.logging.Log;
import freemarker.template.TemplateException;
import org.apache.commons.cli.*;
import org.apache.commons.lang3.SystemUtils;
import java.io.File;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Optional;
public class EMADLGeneratorCli {
public static final Option OPTION_MODELS_PATH = Option.builder("m")
.longOpt("models-dir")
.desc("full path to directory with EMADL models e.g. C:\\Users\\vpupkin\\proj\\MyAwesomeAutopilot\\src\\main\\emam")
.hasArg(true)
.required(true)
.build();
import static de.monticore.lang.monticar.generator.cpp.GeneratorCppCli.*;
public static final Option OPTION_ROOT_MODEL = Option.builder("r")
.longOpt("root-model")
.desc("fully qualified name of the root model e.g. de.rwth.vpupkin.modeling.mySuperAwesomeAutopilotComponent")
.hasArg(true)
.required(true)
.build();
public class EMADLGeneratorCli {
public static final Option OPTION_OUTPUT_PATH = Option.builder("o")
.longOpt("output-dir")
.desc("full path to output directory for tests e.g. C:\\Users\\vpupkin\\proj\\MyAwesomeAutopilot\\target\\gen-cpp")
.desc("full path to output directory for tests e.g. C:\\Users\\vpupkin\\proj\\MyAwesomeAutopilot\\target\\gen-cpp\n" +
"default is ./target/generated-sources-emadl/")
.hasArg(true)
.required(false)
.build();
......@@ -41,7 +33,7 @@ public class EMADLGeneratorCli {
public static final Option OPTION_TRAINING_PYTHON_PATH = Option.builder("p")
.longOpt("python")
.desc("path to python. Default is /usr/bin/python")
.desc("path to python. Default is /usr/bin/python, or python (PATH) for windows")
.hasArg(true)
.required(false)
.build();
......@@ -55,7 +47,7 @@ public class EMADLGeneratorCli {
public static final Option OPTION_COMPILE = Option.builder("c")
.longOpt("compile")
.desc("Compile the generated c code. Needs to be disabled eg. on Windows. Options: y (compile), n (don't compile). Default is y")
.desc("Compile the generated c code. Options: y (compile), n (don't compile). Default is y")
.hasArg(true)
.required(false)
.build();
......@@ -73,16 +65,20 @@ public class EMADLGeneratorCli {
}
}
private static Options getOptions() {
public static Options getOptions() {
Options options = new Options();
options.addOption(OPTION_MODELS_PATH);
options.addOption(OPTION_ROOT_MODEL);
options.addOption(OPTION_OUTPUT_PATH);
addBaseOptions(options);
addEMAM2CPPOptions(options);
addEMADL2CPPOptions(options);
return options;
}
// Add EMADL2CPP Options
public static void addEMADL2CPPOptions(Options options) {
options.addOption(OPTION_BACKEND);
options.addOption(OPTION_RESTRAINED_TRAINING);
options.addOption(OPTION_TRAINING_PYTHON_PATH);
options.addOption(OPTION_COMPILE);
return options;
}
private static CommandLine parseArgs(Options options, CommandLineParser parser, String[] args) {
......@@ -120,14 +116,14 @@ public class EMADLGeneratorCli {
}
if (pythonPath == null) {
pythonPath = "/usr/bin/python";
pythonPath = SystemUtils.IS_OS_WINDOWS ? "python" : "/usr/bin/python";
}
if (forced == null) {
forced = DEFAULT_FORCED;
}
else if (!forced.equals("y") && !forced.equals("n")) {
Log.error("specified setting ("+forced+") for forcing/preventing training not supported. set to default value " + DEFAULT_FORCED);
Log.warn("specified setting ("+forced+") for forcing/preventing training not supported. set to default value " + DEFAULT_FORCED);
forced = DEFAULT_FORCED;
}
......@@ -137,13 +133,44 @@ public class EMADLGeneratorCli {
compile = DEFAULT_COMPILE;
}
else if(!compile.equals("y") && !compile.equals("n")) {
Log.error("specified setting ("+compile+") for skipping the compilation not supported. set to default value " + DEFAULT_COMPILE);
Log.warn("specified setting ("+compile+") for skipping the compilation not supported. set to default value " + DEFAULT_COMPILE);
compile = DEFAULT_COMPILE;
}
if (outputPath != null){
generator.setGenerationTargetPath(outputPath);
}
generator.setGenerateCMake(true);
// EMAM2CPP options
GeneratorCPP emamGen = generator.getEmamGen();
Path modelsDirPath = Paths.get(cliArgs.getOptionValue(OPTION_MODELS_PATH.getOpt()));
emamGen.setUseAlgebraicOptimizations(false);
emamGen.setUseThreadingOptimization(false);
emamGen.setModelsDirPath(modelsDirPath);
// emamGen.setGenerationTargetPath(outputPath); // done by EMADLGenerator
emamGen.setGenerateTests(cliArgs.hasOption(OPTION_FLAG_TESTS.getOpt()));
emamGen.setImportArmadillo(cliArgs.hasOption(OPTION_IMPORT_ARMADILLO.getLongOpt()));
emamGen.setGenerateDynamicInterface(cliArgs.hasOption(OPTION_FLAG_DYNAMIC_INTERFACE.getLongOpt()));
emamGen.setGenerateServerAdapter(cliArgs.hasOption(OPTION_FLAG_GEN_TCP_SERVER.getLongOpt()));
emamGen.setGenerateDDCAdapter(cliArgs.hasOption(OPTION_FLAG_GEN_DDC_ADAPTER.getLongOpt()));
emamGen.setOutputName(cliArgs.getOptionValue(OPTION_OUTPUT_NAME.getOpt()));
if (cliArgs.hasOption(OPTION_FLAG_ARMADILLO.getOpt())) {
emamGen.useArmadilloBackend();
}
emamGen.setCheckModelDir(cliArgs.hasOption(OPTION_FLAG_CHECK_MODEL_DIR.getLongOpt()));
emamGen.setGenerateServerWrapper(cliArgs.hasOption(OPTION_FLAG_SERVER_WRAPPER.getLongOpt()));
emamGen.setUseAlgebraicOptimizations(cliArgs.hasOption(OPTION_FLAG_ALGEBRAIC.getLongOpt()));
emamGen.setUseThreadingOptimization(cliArgs.hasOption(OPTION_FLAG_THREADING.getLongOpt()));
emamGen.setExecutionLoggingActive(cliArgs.hasOption(OPTION_FLAG_EXEC_LOGGING.getLongOpt()));
emamGen.setGenerateCMake(cliArgs.hasOption(OPTION_FLAG_CMAKE.getLongOpt()));
// end EMAM2CPP options
try{
generator.generate(cliArgs.getOptionValue(OPTION_MODELS_PATH.getOpt()), rootModelName, pythonPath, forced, compile.equals("y"));
}
......
......@@ -219,7 +219,7 @@ public class GenerationTest extends AbstractSymtabTest {
"cartpole_master.h",
"cartpole_master_dqn.h",
"cartpole_master_policy.h",
"CMakeLists.txt",
//"CMakeLists.txt",
"CNNModelLoader.h",
"CNNCreator_cartpole_master_dqn.py",
"CNNNet_cartpole_master_dqn.py",
......@@ -264,7 +264,7 @@ public class GenerationTest extends AbstractSymtabTest {
"mountaincar_master.cpp",
"mountaincar_master.h",
"mountaincar_master_actor.h",
"CMakeLists.txt",
//"CMakeLists.txt",
"CNNModelLoader.h",
"CNNCreator_mountaincar_master_actor.py",
"CNNNet_mountaincar_master_actor.py",
......
......@@ -25,7 +25,7 @@ public class IntegrationPythonWrapperTest extends AbstractSymtabTest {
Paths.get("./target/generated-sources-emadl"),
Paths.get("./src/test/resources/target_code/gluon/reinforcementModel/torcs"),
Arrays.asList(
"CMakeLists.txt",
//"CMakeLists.txt",
"CNNModelLoader.h",
"torcs_agent_torcsAgent.cpp",
"torcs_agent_torcsAgent.h",
......@@ -38,11 +38,11 @@ public class IntegrationPythonWrapperTest extends AbstractSymtabTest {
"CNNTranslator.h",
"HelperA.h",
"start_training.sh",
"reward/CMakeLists.txt",
//"reward/CMakeLists.txt",
"reward/HelperA.h",
"reward/torcs_agent_dqn_reward.cpp",
"reward/torcs_agent_dqn_reward.h",
"reward/pylib/CMakeLists.txt",
//"reward/pylib/CMakeLists.txt",
"reward/pylib/torcs_agent_dqn_reward_executor.cpp",
"reward/pylib/torcs_agent_dqn_reward_executor.h",
"reward/pylib/torcs_agent_dqn_reward_executor.i",
......@@ -79,7 +79,7 @@ public class IntegrationPythonWrapperTest extends AbstractSymtabTest {
Paths.get("./target/generated-sources-emadl"),
Paths.get("./src/test/resources/target_code/gluon/reinforcementModel/torcs_td3"),
Arrays.asList(
"CMakeLists.txt",
//"CMakeLists.txt",
"CNNModelLoader.h",
"torcs_agent_torcsAgent.cpp",
"torcs_agent_torcsAgent.h",
......@@ -89,10 +89,10 @@ public class IntegrationPythonWrapperTest extends AbstractSymtabTest {
"CNNPredictor_torcs_agent_torcsAgent_actor.h",
"CNNTrainer_torcs_agent_torcsAgent_actor.py",
"start_training.sh",
"reward/CMakeLists.txt",
//"reward/CMakeLists.txt",
"reward/torcs_agent_network_reward.cpp",
"reward/torcs_agent_network_reward.h",
"reward/pylib/CMakeLists.txt",
//"reward/pylib/CMakeLists.txt",
"reward/pylib/torcs_agent_network_reward_executor.cpp",
"reward/pylib/torcs_agent_network_reward_executor.h",
"reward/pylib/torcs_agent_network_reward_executor.i",
......
......@@ -674,8 +674,13 @@ class CNNSupervisedTrainer_mnist_mnistClassifier_net:
global_loss_test /= (test_batches * single_pu_batch_size)
test_metric_name = metric.get()[0]
test_metric_score = metric.get()[1]
metric_file = open(self._net_creator._model_dir_ + 'metric.txt', 'w')
metric_file.write(test_metric_name + " " + str(test_metric_score))
metric_file.close()
logging.info("Epoch[%d] Train metric: %f, Test metric: %f, Train loss: %f, Test loss: %f" % (epoch, train_metric_score, test_metric_score, global_loss_train, global_loss_test))
if (epoch+1) % checkpoint_period == 0:
......
......@@ -11,10 +11,6 @@ find_package(Armadillo REQUIRED)
set(INCLUDE_DIRS ${INCLUDE_DIRS} ${Armadillo_INCLUDE_DIRS})
set(LIBS ${LIBS} ${Armadillo_LIBRARIES})
find_package(Armadillo REQUIRED)
set(INCLUDE_DIRS ${INCLUDE_DIRS} ${Armadillo_INCLUDE_DIRS})
set(LIBS ${LIBS} ${Armadillo_LIBRARIES})
# additional library linkage
......
......@@ -11,10 +11,6 @@ find_package(Armadillo REQUIRED)
set(INCLUDE_DIRS ${INCLUDE_DIRS} ${Armadillo_INCLUDE_DIRS})
set(LIBS ${LIBS} ${Armadillo_LIBRARIES})
find_package(Armadillo REQUIRED)
set(INCLUDE_DIRS ${INCLUDE_DIRS} ${Armadillo_INCLUDE_DIRS})
set(LIBS ${LIBS} ${Armadillo_LIBRARIES})
# additional library linkage
......
......@@ -11,10 +11,6 @@ find_package(Armadillo REQUIRED)
set(INCLUDE_DIRS ${INCLUDE_DIRS} ${Armadillo_INCLUDE_DIRS})
set(LIBS ${LIBS} ${Armadillo_LIBRARIES})
find_package(Armadillo REQUIRED)
set(INCLUDE_DIRS ${INCLUDE_DIRS} ${Armadillo_INCLUDE_DIRS})
set(LIBS ${LIBS} ${Armadillo_LIBRARIES})
# additional library linkage
......
......@@ -11,10 +11,6 @@ find_package(Armadillo REQUIRED)
set(INCLUDE_DIRS ${INCLUDE_DIRS} ${Armadillo_INCLUDE_DIRS})
set(LIBS ${LIBS} ${Armadillo_LIBRARIES})
find_package(Armadillo REQUIRED)
set(INCLUDE_DIRS ${INCLUDE_DIRS} ${Armadillo_INCLUDE_DIRS})
set(LIBS ${LIBS} ${Armadillo_LIBRARIES})
# additional library linkage
......