Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
What's new
7
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Open sidebar
monticore
EmbeddedMontiArc
generators
EMADL2CPP
Commits
7f278cce
Commit
7f278cce
authored
Aug 26, 2018
by
Evgeny Kusmenko
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'adapt_different_backends' into 'master'
Adapt different backends, moved to a newer EMADL version See merge request
!5
parents
9c3425c2
4e6e6673
Pipeline
#70325
passed with stage
in 2 minutes and 25 seconds
Changes
22
Pipelines
1
Hide whitespace changes
Inline
Side-by-side
Showing
22 changed files
with
220 additions
and
184 deletions
+220
-184
.gitlab-ci.yml
.gitlab-ci.yml
+9
-6
README.md
README.md
+2
-0
pom.xml
pom.xml
+35
-6
settings.xml
settings.xml
+18
-0
src/main/java/de/monticore/lang/monticar/emadl/generator/Backend.java
...a/de/monticore/lang/monticar/emadl/generator/Backend.java
+38
-0
src/main/java/de/monticore/lang/monticar/emadl/generator/EMADLAbstractSymtab.java
...re/lang/monticar/emadl/generator/EMADLAbstractSymtab.java
+4
-1
src/main/java/de/monticore/lang/monticar/emadl/generator/EMADLGenerator.java
...nticore/lang/monticar/emadl/generator/EMADLGenerator.java
+55
-56
src/main/java/de/monticore/lang/monticar/emadl/generator/EMADLGeneratorCli.java
...core/lang/monticar/emadl/generator/EMADLGeneratorCli.java
+23
-1
src/main/java/de/monticore/lang/monticar/emadl/generator/TemplateConfiguration.java
.../lang/monticar/emadl/generator/TemplateConfiguration.java
+0
-48
src/main/resources/CNNTranslator.h
src/main/resources/CNNTranslator.h
+0
-0
src/main/resources/templates/CNNTrainer.ftl
src/main/resources/templates/CNNTrainer.ftl
+0
-21
src/test/java/de/monticore/lang/monticar/emadl/AbstractSymtabTest.java
.../de/monticore/lang/monticar/emadl/AbstractSymtabTest.java
+2
-2
src/test/java/de/monticore/lang/monticar/emadl/GenerationTest.java
...java/de/monticore/lang/monticar/emadl/GenerationTest.java
+9
-9
src/test/java/de/monticore/lang/monticar/emadl/SymtabTest.java
...est/java/de/monticore/lang/monticar/emadl/SymtabTest.java
+0
-2
src/test/resources/models/InstanceTest/MainB.emadl
src/test/resources/models/InstanceTest/MainB.emadl
+0
-3
src/test/resources/models/cifar10/Cifar10Classifier.emadl
src/test/resources/models/cifar10/Cifar10Classifier.emadl
+0
-2
src/test/resources/target_code/CNNCreator_cifar10_cifar10Classifier_net.py
...s/target_code/CNNCreator_cifar10_cifar10Classifier_net.py
+3
-1
src/test/resources/target_code/CNNPredictor_cifar10_cifar10Classifier_net.h
.../target_code/CNNPredictor_cifar10_cifar10Classifier_net.h
+1
-1
src/test/resources/target_code/CNNTrainer_cifar10_Cifar10Classifier.py
...urces/target_code/CNNTrainer_cifar10_Cifar10Classifier.py
+12
-16
src/test/resources/target_code/cifar10_cifar10Classifier.h
src/test/resources/target_code/cifar10_cifar10Classifier.h
+3
-3
src/test/resources/target_code/cifar10_cifar10Classifier_calculateClass.h
...es/target_code/cifar10_cifar10Classifier_calculateClass.h
+4
-4
src/test/resources/target_code/cifar10_cifar10Classifier_net.h
...est/resources/target_code/cifar10_cifar10Classifier_net.h
+2
-2
No files found.
.gitlab-ci.yml
View file @
7f278cce
...
...
@@ -28,20 +28,23 @@ masterJobLinux:
image
:
maven:3-jdk-8
script
:
-
mvn -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn -B clean deploy --settings settings.xml
-
cat target/site/jacoco/index.html
-
mvn package sonar:sonar -s settings.xml
only
:
-
master
masterJobWindows
:
stage
:
windows
script
:
-
mvn -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn -B clean install --settings settings.xml
tags
:
-
Windows10
#
masterJobWindows:
#
stage: windows
#
script:
#
- mvn -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn -B clean install --settings settings.xml
#
tags:
#
- Windows10
BranchJobLinux
:
stage
:
linux
image
:
maven:3-jdk-8
script
:
-
mvn -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn -B clean install --settings settings.xml
-
cat target/site/jacoco/index.html
except
:
-
master
README.md
View file @
7f278cce


# EMADL2CPP
Generates CPP/Python code for EmbeddedMontiArcDL.
See example project
[
EMADL-Demo
](
https://git.rwth-aachen.de/thomas.timmermanns/EMADL-Demo
)
for more information on how the generated code can be used.
\ No newline at end of file
pom.xml
View file @
7f278cce
...
...
@@ -8,17 +8,18 @@
<groupId>
de.monticore.lang.monticar
</groupId>
<artifactId>
embedded-montiarc-emadl-generator
</artifactId>
<version>
0.2.
1
-SNAPSHOT
</version>
<version>
0.2.
2
-SNAPSHOT
</version>
<!-- == PROJECT DEPENDENCIES ============================================= -->
<properties>
<!-- .. SE-Libraries .................................................. -->
<emadl.version>
0.2.1-SNAPSHOT
</emadl.version>
<CNNTrain.version>
0.2.1-SNAPSHOT
</CNNTrain.version>
<cnnarch-generator.version>
0.2.1-SNAPSHOT
</cnnarch-generator.version>
<embedded-montiarc-math-generator>
0.0.10
</embedded-montiarc-math-generator>
<emadl.version>
0.2.2-SNAPSHOT
</emadl.version>
<CNNTrain.version>
0.2.4-SNAPSHOT
</CNNTrain.version>
<cnnarch-mxnet-generator.version>
0.2.3-SNAPSHOT
</cnnarch-mxnet-generator.version>
<cnnarch-caffe2-generator.version>
0.2.2-SNAPSHOT
</cnnarch-caffe2-generator.version>
<embedded-montiarc-math-generator>
0.0.25-SNAPSHOT
</embedded-montiarc-math-generator>
<!-- .. Libraries .................................................. -->
<guava.version>
18.0
</guava.version>
...
...
@@ -31,6 +32,7 @@
<compiler.plugin>
3.3
</compiler.plugin>
<source.plugin>
2.4
</source.plugin>
<shade.plugin>
2.4.3
</shade.plugin>
<jacoco.plugin>
0.8.1
</jacoco.plugin>
<!-- Classifiers -->
<grammars.classifier>
grammars
</grammars.classifier>
...
...
@@ -68,7 +70,13 @@
<dependency>
<groupId>
de.monticore.lang.monticar
</groupId>
<artifactId>
cnnarch-mxnet-generator
</artifactId>
<version>
${cnnarch-generator.version}
</version>
<version>
${cnnarch-mxnet-generator.version}
</version>
</dependency>
<dependency>
<groupId>
de.monticore.lang.monticar
</groupId>
<artifactId>
cnnarch-caffe2-generator
</artifactId>
<version>
${cnnarch-caffe2-generator.version}
</version>
</dependency>
<dependency>
...
...
@@ -132,6 +140,27 @@
<version>
2.8.1
</version>
</plugin>
<!-- Test coverage -->
<plugin>
<groupId>
org.jacoco
</groupId>
<artifactId>
jacoco-maven-plugin
</artifactId>
<version>
${jacoco.plugin}
</version>
<executions>
<execution>
<id>
pre-unit-test
</id>
<goals>
<goal>
prepare-agent
</goal>
</goals>
</execution>
<execution>
<id>
post-unit-test
</id>
<phase>
test
</phase>
<goals>
<goal>
report
</goal>
</goals>
</execution>
</executions>
</plugin>
<!-- Other Configuration -->
<plugin>
<artifactId>
maven-compiler-plugin
</artifactId>
...
...
settings.xml
View file @
7f278cce
...
...
@@ -57,6 +57,24 @@
</mirrors>
<profiles>
<profile>
<id>
sonar
</id>
<activation>
<activeByDefault>
true
</activeByDefault>
</activation>
<properties>
<!-- Optional URL to server. Default value is http://localhost:9000 -->
<sonar.host.url>
https://metric.se.rwth-aachen.de
</sonar.host.url>
<sonar.login>
jenkins
</sonar.login>
<sonar.password>
${env.sonar}
</sonar.password>
</properties>
</profile>
<profile>
<id>
se-nexus
</id>
...
...
src/main/java/de/monticore/lang/monticar/emadl/generator/Backend.java
0 → 100644
View file @
7f278cce
package
de.monticore.lang.monticar.emadl.generator
;
import
de.monticore.lang.monticar.cnnarch.CNNArchGenerator
;
import
de.monticore.lang.monticar.cnnarch.mxnetgenerator.CNNArch2MxNet
;
import
de.monticore.lang.monticar.cnnarch.caffe2generator.CNNArch2Caffe2
;
import
java.util.Optional
;
public
enum
Backend
{
MXNET
{
@Override
public
CNNArchGenerator
getGenerator
()
{
return
new
CNNArch2MxNet
();
}
},
CAFFE2
{
@Override
public
CNNArchGenerator
getGenerator
()
{
return
new
CNNArch2Caffe2
();
}
};
public
abstract
CNNArchGenerator
getGenerator
();
public
static
Optional
<
Backend
>
getBackendFromString
(
String
backend
){
switch
(
backend
){
case
"MXNET"
:
return
Optional
.
of
(
MXNET
);
case
"CAFFE2"
:
return
Optional
.
of
(
CAFFE2
);
default
:
return
Optional
.
empty
();
}
}
}
src/main/java/de/monticore/lang/monticar/emadl/generator/AbstractSymtab.java
→
src/main/java/de/monticore/lang/monticar/emadl/generator/
EMADL
AbstractSymtab.java
View file @
7f278cce
...
...
@@ -44,7 +44,10 @@ import de.monticore.symboltable.Scope;
import
java.nio.file.Paths
;
import
java.util.Arrays
;
public
class
AbstractSymtab
{
public
class
EMADLAbstractSymtab
{
public
EMADLAbstractSymtab
()
{
}
public
static
TaggingResolver
createSymTabAndTaggingResolver
(
String
...
modelPath
)
{
Scope
scope
=
createSymTab
(
modelPath
);
TaggingResolver
tagging
=
new
TaggingResolver
(
scope
,
Arrays
.
asList
(
modelPath
));
...
...
src/main/java/de/monticore/lang/monticar/emadl/generator/EMADLGenerator.java
View file @
7f278cce
...
...
@@ -22,14 +22,18 @@ package de.monticore.lang.monticar.emadl.generator;
import
com.google.common.base.Joiner
;
import
com.google.common.base.Splitter
;
import
com.google.common.base.Charsets
;
import
com.google.common.io.Resources
;
import
de.monticore.io.paths.ModelPath
;
import
de.monticore.lang.embeddedmontiarc.embeddedmontiarc._symboltable.ComponentSymbol
;
import
de.monticore.lang.embeddedmontiarc.embeddedmontiarc._symboltable.ExpandedComponentInstanceSymbol
;
import
de.monticore.lang.math.math._symboltable.MathStatementsSymbol
;
import
de.monticore.lang.math._symboltable.MathStatementsSymbol
;
import
de.monticore.lang.monticar.cnnarch.CNNArchGenerator
;
import
de.monticore.lang.monticar.cnnarch._symboltable.ArchitectureSymbol
;
import
de.monticore.lang.monticar.cnnarch.generator.CNNArchGenerator
;
import
de.monticore.lang.monticar.cnntrain._cocos.CNNTrainCocos
;
import
de.monticore.lang.monticar.cnntrain._symboltable.CNNTrainCompilationUnitSymbol
;
import
de.monticore.lang.monticar.cnntrain._symboltable.CNNTrainLanguage
;
import
de.monticore.lang.monticar.cnntrain.
generator.CNNTrainGenerator
;
import
de.monticore.lang.monticar.cnntrain.
_symboltable.ConfigurationSymbol
;
import
de.monticore.lang.monticar.emadl._cocos.EMADLCocos
;
import
de.monticore.lang.monticar.generator.FileContent
;
import
de.monticore.lang.monticar.generator.cpp.ArmadilloHelper
;
...
...
@@ -42,11 +46,10 @@ import de.monticore.symboltable.GlobalScope;
import
de.monticore.symboltable.Scope
;
import
de.se_rwth.commons.Splitters
;
import
de.se_rwth.commons.logging.Log
;
import
freemarker.template.Template
;
import
freemarker.template.TemplateException
;
import
java.io.
IOException
;
import
java.io.
StringWriter
;
import
java.io.
*
;
import
java.
n
io.
charset.Charset
;
import
java.nio.file.Files
;
import
java.nio.file.Path
;
import
java.nio.file.Paths
;
...
...
@@ -55,19 +58,19 @@ import java.util.*;
public
class
EMADLGenerator
{
public
static
final
String
CNN_HELPER
=
"CNNTranslator"
;
public
static
final
String
CNN_TRAINER
=
"CNNTrainer"
;
private
GeneratorCPP
emamGen
;
private
CNNArchGenerator
cnnArchGenerator
;
private
String
modelsPath
;
public
EMADLGenerator
()
{
public
EMADLGenerator
(
Backend
backend
)
{
emamGen
=
new
GeneratorCPP
();
emamGen
.
useArmadilloBackend
();
emamGen
.
setGenerationTargetPath
(
"./target/generated-sources-emadl/"
);
cnnArchGenerator
=
backend
.
getGenerator
();
}
private
String
modelsPath
;
public
String
getModelsPath
()
{
return
modelsPath
;
}
...
...
@@ -100,7 +103,7 @@ public class EMADLGenerator {
public
void
generate
(
String
modelPath
,
String
qualifiedName
)
throws
IOException
,
TemplateException
{
setModelsPath
(
modelPath
);
TaggingResolver
symtab
=
AbstractSymtab
.
createSymTabAndTaggingResolver
(
getModelsPath
());
TaggingResolver
symtab
=
EMADL
AbstractSymtab
.
createSymTabAndTaggingResolver
(
getModelsPath
());
ComponentSymbol
component
=
symtab
.<
ComponentSymbol
>
resolve
(
qualifiedName
,
ComponentSymbol
.
KIND
).
orElse
(
null
);
List
<
String
>
splitName
=
Splitters
.
DOT
.
splitToList
(
qualifiedName
);
...
...
@@ -131,7 +134,7 @@ public class EMADLGenerator {
generateComponent
(
fileContents
,
allInstances
,
taggingResolver
,
componentInstanceSymbol
,
symtab
);
fileContents
.
add
(
generateCNNTrainer
(
allInstances
,
componentInstanceSymbol
.
getComponentType
().
getFullName
().
replaceAll
(
"\\."
,
"_"
)));
fileContents
.
add
All
(
generateCNNTrainer
(
allInstances
,
componentInstanceSymbol
.
getComponentType
().
getFullName
().
replaceAll
(
"\\."
,
"_"
)));
fileContents
.
add
(
ArmadilloHelper
.
getArmadilloHelperFileContent
());
TypesGeneratorCPP
tg
=
new
TypesGeneratorCPP
();
fileContents
.
addAll
(
tg
.
generateTypes
(
TypeConverter
.
getTypeSymbols
()));
...
...
@@ -185,7 +188,6 @@ public class EMADLGenerator {
}
public
void
generateCNN
(
List
<
FileContent
>
fileContents
,
TaggingResolver
taggingResolver
,
ExpandedComponentInstanceSymbol
instance
,
ArchitectureSymbol
architecture
){
CNNArchGenerator
cnnArchGenerator
=
new
CNNArchGenerator
();
Map
<
String
,
String
>
contentMap
=
cnnArchGenerator
.
generateStrings
(
architecture
);
String
fullName
=
instance
.
getFullName
().
replaceAll
(
"\\."
,
"_"
);
...
...
@@ -206,7 +208,7 @@ public class EMADLGenerator {
fileContents
.
add
(
new
FileContent
(
contentMap
.
get
(
fileName
),
fileName
));
}
fileContents
.
add
(
componentFileContent
);
fileContents
.
add
(
new
FileContent
(
processTemplate
(
new
HashMap
<>(),
CNN_HELPER
),
CNN
_HELPER
+
"
.h"
));
fileContents
.
add
(
new
FileContent
(
readResource
(
"CNNTranslator.h"
,
Charsets
.
UTF_8
),
"
CNN
Translator
.h"
));
}
protected
String
transformComponent
(
String
component
,
String
predictorClassName
,
String
executeMethod
){
...
...
@@ -215,7 +217,7 @@ public class EMADLGenerator {
//insert includes
component
=
component
.
replaceFirst
(
"using namespace"
,
"#include \""
+
predictorClassName
+
".h"
+
"\"\n"
+
"#include \"
"
+
CNN_HELPER
+
".h"
+
"
\"\n"
+
"#include \"
CNNTranslator.h
\"\n"
+
"using namespace"
);
//insert network attribute
...
...
@@ -252,34 +254,28 @@ public class EMADLGenerator {
}
}
public
FileContent
generateCNNTrainer
(
Set
<
ExpandedComponentInstanceSymbol
>
allInstances
,
String
mainComponentName
){
List
<
ExpandedComponentInstanceSymbol
>
cnnInstances
=
new
ArrayList
<>();
List
<
String
>
trainParams
=
new
ArrayList
<>();
Set
<
String
>
componentNames
=
new
HashSet
<>();
for
(
ExpandedComponentInstanceSymbol
componentInstance
:
allInstances
){
public
List
<
FileContent
>
generateCNNTrainer
(
Set
<
ExpandedComponentInstanceSymbol
>
allInstances
,
String
mainComponentName
)
{
List
<
String
>
cnnInstanceNames
=
new
ArrayList
<>();
List
<
ConfigurationSymbol
>
configurations
=
new
ArrayList
<>();
for
(
ExpandedComponentInstanceSymbol
componentInstance
:
allInstances
)
{
ComponentSymbol
component
=
componentInstance
.
getComponentType
().
getReferencedSymbol
();
Optional
<
ArchitectureSymbol
>
architecture
=
component
.
getSpannedScope
().
resolve
(
""
,
ArchitectureSymbol
.
KIND
);
if
(
architecture
.
isPresent
()){
String
fileContent
=
getTrainingParamsForComponent
(
mainComponentName
,
component
,
componentInstance
);
if
(!
fileContent
.
isEmpty
())
{
trainParams
.
add
(
fileContent
);
}
cnnInstances
.
add
(
componentInstance
);
componentNames
.
add
(
component
.
getFullName
());
if
(
architecture
.
isPresent
())
{
ConfigurationSymbol
configuration
=
getTrainingConfiguration
(
mainComponentName
,
component
,
componentInstance
);
configurations
.
add
(
configuration
);
cnnInstanceNames
.
add
(
componentInstance
.
getFullName
().
replaceAll
(
"\\."
,
"_"
));
}
}
Map
<
String
,
Object
>
ftlContext
=
new
HashMap
<>();
ftlContext
.
put
(
"instances"
,
cnnInstances
);
ftlContext
.
put
(
"componentNames"
,
componentNames
);
ftlContext
.
put
(
"trainParams"
,
trainParams
);
return
new
FileContent
(
processTemplate
(
ftlContext
,
CNN_TRAINER
),
CNN_TRAINER
+
"_"
+
mainComponentName
+
".py"
);
List
<
FileContent
>
fileContents
=
new
ArrayList
<>();
Map
<
String
,
String
>
fileContentMap
=
cnnArchGenerator
.
generateTrainer
(
configurations
,
cnnInstanceNames
,
mainComponentName
);
for
(
String
fileName
:
fileContentMap
.
keySet
()){
fileContents
.
add
(
new
FileContent
(
fileContentMap
.
get
(
fileName
),
fileName
));
}
return
fileContents
;
}
p
rivate
String
getTrainingParamsForComponent
(
String
mainComponentName
,
ComponentSymbol
component
,
ExpandedComponentInstanceSymbol
instance
)
{
p
ublic
ConfigurationSymbol
getTrainingConfiguration
(
String
mainComponentName
,
ComponentSymbol
component
,
ExpandedComponentInstanceSymbol
instance
)
{
String
configFilename
;
String
mainComponentConfigFilename
=
mainComponentName
.
replaceAll
(
"\\."
,
"/"
);
String
componentConfigFilename
=
component
.
getFullName
().
replaceAll
(
"\\."
,
"/"
);
...
...
@@ -300,7 +296,7 @@ public class EMADLGenerator {
+
getModelsPath
()
+
componentConfigFilename
+
".cnnt', '"
+
getModelsPath
()
+
mainComponentConfigFilename
+
".cnnt'."
+
" These files denote respectively the configuration for the single instance, the component or the whole system."
);
return
""
;
return
null
;
}
//should be removed when CNNTrain supports packages
...
...
@@ -309,29 +305,32 @@ public class EMADLGenerator {
Path
modelPath
=
Paths
.
get
(
getModelsPath
()
+
Joiner
.
on
(
"/"
).
join
(
names
.
subList
(
0
,
names
.
size
()-
1
)));
//
CNNTrainGenerator
cnnTrainGenerator
=
new
CNNTrainGenerator
();
//
CNNTrainGenerator cnnTrainGenerator = new CNNTrainGenerator();
//No need of cnnTrainGenerator since cnnArchGenerator can also generateTrainer()
final
ModelPath
mp
=
new
ModelPath
(
modelPath
);
GlobalScope
trainScope
=
new
GlobalScope
(
mp
,
new
CNNTrainLanguage
());
Map
.
Entry
<
String
,
String
>
fileContents
=
cnnTrainGenerator
.
generateFileContent
(
trainScope
,
configFilename
);
return
fileContents
.
getValue
();
Optional
<
CNNTrainCompilationUnitSymbol
>
compilationUnit
=
trainScope
.
resolve
(
configFilename
,
CNNTrainCompilationUnitSymbol
.
KIND
);
if
(!
compilationUnit
.
isPresent
()){
Log
.
error
(
"CNNTrainCompilationUnitSymbol is empty. Could not resolve configuration "
+
configFilename
);
System
.
exit
(
1
);
}
CNNTrainCocos
.
checkAll
(
compilationUnit
.
get
());
ConfigurationSymbol
configuration
=
compilationUnit
.
get
().
getConfiguration
();
return
configuration
;
}
protected
String
processTemplate
(
Map
<
String
,
Object
>
ftlContext
,
String
templateNameWithoutEnding
){
StringWriter
writer
=
new
StringWriter
();
String
templateName
=
templateNameWithoutEnding
+
".ftl"
;
try
{
Template
template
=
TemplateConfiguration
.
get
().
getTemplate
(
templateName
);
template
.
process
(
ftlContext
,
writer
);
}
catch
(
IOException
e
)
{
Log
.
error
(
"Freemarker could not find template "
+
templateName
+
" :\n"
+
e
.
getMessage
());
public
String
readResource
(
final
String
fileName
,
Charset
charset
)
{
try
{
return
Resources
.
toString
(
Resources
.
getResource
(
fileName
),
charset
);
}
catch
(
IllegalArgumentException
e
)
{
System
.
err
.
println
(
"Resource file "
+
fileName
+
" not found"
);
System
.
exit
(
1
);
}
catch
(
Template
Exception
e
){
Log
.
error
(
"An exception
occured
in template "
+
templateName
+
" :\n"
+
e
.
getMessage
()
);
return
null
;
}
catch
(
IO
Exception
e
)
{
System
.
err
.
println
(
"IO Error
occur
r
ed
"
);
System
.
exit
(
1
);
return
null
;
}
return
writer
.
toString
();
}
}
src/main/java/de/monticore/lang/monticar/emadl/generator/EMADLGeneratorCli.java
View file @
7f278cce
...
...
@@ -26,6 +26,7 @@ import freemarker.template.TemplateException;
import
org.apache.commons.cli.*
;
import
java.io.IOException
;
import
java.util.Optional
;
public
class
EMADLGeneratorCli
{
...
...
@@ -49,6 +50,12 @@ public class EMADLGeneratorCli {
.
hasArg
(
true
)
.
required
(
false
)
.
build
();
public
static
final
Option
OPTION_BACKEND
=
Option
.
builder
(
"b"
)
.
longOpt
(
"backend"
)
.
desc
(
"deep-learning-framework backend. Options: MXNET, CAFFE2"
)
.
hasArg
(
true
)
.
required
(
false
)
.
build
();
private
EMADLGeneratorCli
()
{
}
...
...
@@ -67,6 +74,7 @@ public class EMADLGeneratorCli {
options
.
addOption
(
OPTION_MODELS_PATH
);
options
.
addOption
(
OPTION_ROOT_MODEL
);
options
.
addOption
(
OPTION_OUTPUT_PATH
);
options
.
addOption
(
OPTION_BACKEND
);
return
options
;
}
...
...
@@ -85,7 +93,21 @@ public class EMADLGeneratorCli {
private
static
void
runGenerator
(
CommandLine
cliArgs
)
{
String
rootModelName
=
cliArgs
.
getOptionValue
(
OPTION_ROOT_MODEL
.
getOpt
());
String
outputPath
=
cliArgs
.
getOptionValue
(
OPTION_OUTPUT_PATH
.
getOpt
());
EMADLGenerator
generator
=
new
EMADLGenerator
();
String
backendString
=
cliArgs
.
getOptionValue
(
OPTION_BACKEND
.
getOpt
());
final
String
DEFAULT_BACKEND
=
"MXNET"
;
if
(
backendString
==
null
)
{
Log
.
warn
(
"backend not specified. backend set to default value "
+
DEFAULT_BACKEND
);
backendString
=
DEFAULT_BACKEND
;
}
Optional
<
Backend
>
backend
=
Backend
.
getBackendFromString
(
backendString
);
if
(!
backend
.
isPresent
()){
Log
.
warn
(
"specified backend "
+
backendString
+
" not supported. backend set to default value "
+
DEFAULT_BACKEND
);
backend
=
Backend
.
getBackendFromString
(
DEFAULT_BACKEND
);
}
EMADLGenerator
generator
=
new
EMADLGenerator
(
backend
.
get
());
if
(
outputPath
!=
null
){
generator
.
setGenerationTargetPath
(
outputPath
);
}
...
...
src/main/java/de/monticore/lang/monticar/emadl/generator/TemplateConfiguration.java
deleted
100644 → 0
View file @
9c3425c2
/**
*
* ******************************************************************************
* MontiCAR Modeling Family, www.se-rwth.de
* Copyright (c) 2017, Software Engineering Group at RWTH Aachen,
* All rights reserved.
*
* This project is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 3.0 of the License, or (at your option) any later version.
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this project. If not, see <http://www.gnu.org/licenses/>.
* *******************************************************************************
*/
package
de.monticore.lang.monticar.emadl.generator
;
import
freemarker.template.Configuration
;
import
freemarker.template.TemplateExceptionHandler
;
public
class
TemplateConfiguration
{
private
static
TemplateConfiguration
instance
;
private
Configuration
configuration
;
private
TemplateConfiguration
()
{
configuration
=
new
Configuration
(
Configuration
.
VERSION_2_3_23
);
configuration
.
setClassForTemplateLoading
(
TemplateConfiguration
.
class
,
"/templates/"
);
configuration
.
setDefaultEncoding
(
"UTF-8"
);
configuration
.
setTemplateExceptionHandler
(
TemplateExceptionHandler
.
RETHROW_HANDLER
);
}
public
Configuration
getConfiguration
()
{
return
configuration
;
}
public
static
Configuration
get
(){
if
(
instance
==
null
){
instance
=
new
TemplateConfiguration
();
}
return
instance
.
getConfiguration
();
}
}
src/main/resources/
templates/
CNNTranslator.
ftl
→
src/main/resources/CNNTranslator.
h
View file @
7f278cce
File moved
src/main/resources/templates/CNNTrainer.ftl
deleted
100644 → 0
View file @
9c3425c2
import logging
import mxnet as mx
<#list instances as instance>
import CNNCreator_${instance.fullName?replace(".", "_")}
</#list>
if __name__ == "__main__":
logging.basicConfig(level=logging.DEBUG)
logger = logging.getLogger()
handler = logging.FileHandler("train.log","w", encoding=None, delay="true")
logger.addHandler(handler)
<#list instances as instance>
${instance.fullName?replace(".", "_")} = CNNCreator_${instance.fullName?replace(".", "_")}.CNNCreator_${instance.fullName?replace(".", "_")}()
${instance.fullName?replace(".", "_")}.train(
<#if (trainParams[instance_index])??>
${trainParams[instance_index]}
</#if>
)
</#list>
\ No newline at end of file
src/test/java/de/monticore/lang/monticar/emadl/AbstractSymtabTest.java
View file @
7f278cce
...
...
@@ -20,7 +20,7 @@
*/
package
de.monticore.lang.monticar.emadl
;
import
de.monticore.lang.monticar.emadl.generator.AbstractSymtab
;
import
de.monticore.lang.monticar.emadl.generator.
EMADL
AbstractSymtab
;
import
de.monticore.lang.tagging._symboltable.TaggingResolver
;
import
org.junit.Assert
;
...
...
@@ -36,7 +36,7 @@ import static org.junit.Assert.assertTrue;
public
class
AbstractSymtabTest
{
protected
static
TaggingResolver
createSymTab
(
String
...
modelPath
)
{
return
AbstractSymtab
.
createSymTabAndTaggingResolver
(
modelPath
);
return
EMADL
AbstractSymtab
.
createSymTabAndTaggingResolver
(
modelPath
);
}
public
static
void
checkFilesAreEqual
(
Path
generationPath
,
Path
resultsPath
,
List
<
String
>
fileNames
)
{
...
...
src/test/java/de/monticore/lang/monticar/emadl/GenerationTest.java
View file @
7f278cce
...
...
@@ -44,7 +44,7 @@ public class GenerationTest extends AbstractSymtabTest {
@Test
public
void
testCifar10Generation
()
throws
IOException
,
TemplateException
{
Log
.
getFindings
().
clear
();
String
[]
args
=
{
"-m"
,
"src/test/resources/models/"
,
"-r"
,
"cifar10.Cifar10Classifier"
};
String
[]
args
=
{
"-m"
,
"src/test/resources/models/"
,
"-r"
,
"cifar10.Cifar10Classifier"
,
"-b"
,
"MXNET"
};
EMADLGeneratorCli
.
main
(
args
);
assertTrue
(
Log
.
getFindings
().
isEmpty
());
...
...
@@ -65,7 +65,7 @@ public class GenerationTest extends AbstractSymtabTest {
@Test
public
void
testSimulatorGeneration
()
throws
IOException
,
TemplateException
{
Log
.
getFindings
().
clear
();
String
[]
args
=
{
"-m"
,
"src/test/resources/models/"
,
"-r"
,
"simulator.MainController"
};
String
[]
args
=
{
"-m"
,
"src/test/resources/models/"
,
"-r"
,
"simulator.MainController"
,
"-b"
,
"MXNET"
};
EMADLGeneratorCli
.
main
(
args
);
assertTrue
(
Log
.
getFindings
().
isEmpty
());
}
...
...
@@ -73,7 +73,7 @@ public class GenerationTest extends AbstractSymtabTest {
@Test
public
void
testAddGeneration
()
throws
IOException
,
TemplateException
{
Log
.
getFindings
().
clear
();
String
[]
args
=
{
"-m"
,
"src/test/resources/models/"
,
"-r"
,
"Add"
};
String
[]
args
=
{
"-m"
,
"src/test/resources/models/"
,
"-r"
,
"Add"
,
"-b"
,
"MXNET"
};
EMADLGeneratorCli
.
main
(
args
);
assertTrue
(
Log
.
getFindings
().
isEmpty
());
}
...
...
@@ -81,7 +81,7 @@ public class GenerationTest extends AbstractSymtabTest {
@Test
public
void
testAlexnetGeneration
()
throws
IOException
,
TemplateException
{
Log
.
getFindings
().
clear
();
String
[]
args
=
{
"-m"
,
"src/test/resources/models/"
,
"-r"
,
"Alexnet"
};
String
[]
args
=
{
"-m"
,
"src/test/resources/models/"
,
"-r"
,
"Alexnet"
,
"-b"
,
"MXNET"
};
EMADLGeneratorCli
.
main
(
args
);
assertTrue
(
Log
.
getFindings
().
isEmpty
());
}
...
...
@@ -89,7 +89,7 @@ public class GenerationTest extends AbstractSymtabTest {
@Test
public
void
testResNeXtGeneration
()
throws
IOException
,
TemplateException
{
Log
.
getFindings
().
clear
();