chore: import upstream snapshot with attribution
This commit is contained in:
@@ -0,0 +1,69 @@
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<groupId>org.eclipse.deeplearning4j</groupId>
|
||||
<artifactId>blas-lapack-generator</artifactId>
|
||||
<packaging>jar</packaging>
|
||||
|
||||
|
||||
<parent>
|
||||
<groupId>org.eclipse.deeplearning4j</groupId>
|
||||
<artifactId>codegen</artifactId>
|
||||
<version>1.0.0-SNAPSHOT</version>
|
||||
</parent>
|
||||
|
||||
<name>blas-lapack-generator</name>
|
||||
|
||||
<properties>
|
||||
<javaparser.version>3.24.4</javaparser.version>
|
||||
<maven.compiler.source>11</maven.compiler.source>
|
||||
<maven.compiler.target>11</maven.compiler.target>
|
||||
<javapoet.version>1.13.0</javapoet.version>
|
||||
<openblas.version>0.3.28</openblas.version>
|
||||
<javacpp.version>1.5.11</javacpp.version>
|
||||
<openblas.javacpp.version>${openblas.version}-${javacpp.version}</openblas.javacpp.version>
|
||||
</properties>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.eclipse.deeplearning4j</groupId>
|
||||
<artifactId>nd4j-cpu-backend-common</artifactId>
|
||||
<version>${project.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.eclipse.deeplearning4j</groupId>
|
||||
<artifactId>nd4j-native</artifactId>
|
||||
<version>${project.version}</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.reflections</groupId>
|
||||
<artifactId>reflections</artifactId>
|
||||
<version>0.10.2</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.bytedeco</groupId>
|
||||
<artifactId>openblas</artifactId>
|
||||
<version>${openblas.javacpp.version}</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.squareup</groupId>
|
||||
<artifactId>javapoet</artifactId>
|
||||
<version>${javapoet.version}</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.github.javaparser</groupId>
|
||||
<artifactId>javaparser-core-serialization</artifactId>
|
||||
<version>${javaparser.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.github.javaparser</groupId>
|
||||
<artifactId>javaparser-symbol-solver-core</artifactId>
|
||||
<version>${javaparser.version}</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</project>
|
||||
+174
@@ -0,0 +1,174 @@
|
||||
|
||||
/*
|
||||
* ******************************************************************************
|
||||
* *
|
||||
* *
|
||||
* * This program and the accompanying materials are made available under the
|
||||
* * terms of the Apache License, Version 2.0 which is available at
|
||||
* * https://www.apache.org/licenses/LICENSE-2.0.
|
||||
* *
|
||||
* * See the NOTICE file distributed with this work for additional
|
||||
* * information regarding copyright ownership.
|
||||
* * Unless required by applicable law or agreed to in writing, software
|
||||
* * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
* * License for the specific language governing permissions and limitations
|
||||
* * under the License.
|
||||
* *
|
||||
* * SPDX-License-Identifier: Apache-2.0
|
||||
* *****************************************************************************
|
||||
*/
|
||||
package org.deeplearning4j;
|
||||
|
||||
import com.github.javaparser.ParserConfiguration;
|
||||
import com.github.javaparser.StaticJavaParser;
|
||||
import com.github.javaparser.symbolsolver.JavaSymbolSolver;
|
||||
import com.github.javaparser.symbolsolver.resolution.typesolvers.CombinedTypeSolver;
|
||||
import com.github.javaparser.symbolsolver.resolution.typesolvers.JavaParserTypeSolver;
|
||||
import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver;
|
||||
import com.github.javaparser.utils.SourceRoot;
|
||||
import com.squareup.javapoet.*;
|
||||
import org.apache.commons.io.FileUtils;
|
||||
import org.bytedeco.javacpp.Pointer;
|
||||
import org.bytedeco.openblas.global.openblas;
|
||||
|
||||
import javax.lang.model.element.Modifier;
|
||||
import java.io.File;
|
||||
import java.lang.reflect.Method;
|
||||
import java.nio.charset.Charset;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
public class BlasLapackGenerator {
|
||||
|
||||
private SourceRoot sourceRoot;
|
||||
private File rootDir;
|
||||
private File targetFile;
|
||||
|
||||
private static String copyright =
|
||||
"/*\n" +
|
||||
" * ******************************************************************************\n" +
|
||||
" * *\n" +
|
||||
" * *\n" +
|
||||
" * * This program and the accompanying materials are made available under the\n" +
|
||||
" * * terms of the Apache License, Version 2.0 which is available at\n" +
|
||||
" * * https://www.apache.org/licenses/LICENSE-2.0.\n" +
|
||||
" * *\n" +
|
||||
" * * See the NOTICE file distributed with this work for additional\n" +
|
||||
" * * information regarding copyright ownership.\n" +
|
||||
" * * Unless required by applicable law or agreed to in writing, software\n" +
|
||||
" * * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n" +
|
||||
" * * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n" +
|
||||
" * * License for the specific language governing permissions and limitations\n" +
|
||||
" * * under the License.\n" +
|
||||
" * *\n" +
|
||||
" * * SPDX-License-Identifier: Apache-2.0\n" +
|
||||
" * *****************************************************************************\n" +
|
||||
" */\n";
|
||||
private static String codeGenWarning =
|
||||
"\n//================== GENERATED CODE - DO NOT MODIFY THIS FILE ==================\n\n";
|
||||
|
||||
|
||||
private static Set<String> methodsToSkip = new HashSet<>(Arrays.asList(
|
||||
"LAPACK_zlangb_base",
|
||||
"LAPACK_lsame_base",
|
||||
"LAPACK_clangb_base",
|
||||
"LAPACK_lsame_base",
|
||||
"LAPACK_dlangb_base",
|
||||
"LAPACK_slangb_base"
|
||||
|
||||
));
|
||||
|
||||
|
||||
public BlasLapackGenerator(File nd4jApiRootDir) {
|
||||
this.sourceRoot = initSourceRoot(nd4jApiRootDir);
|
||||
this.rootDir = nd4jApiRootDir;
|
||||
}
|
||||
|
||||
public SourceRoot getSourceRoot() {
|
||||
return sourceRoot;
|
||||
}
|
||||
|
||||
public void setSourceRoot(SourceRoot sourceRoot) {
|
||||
this.sourceRoot = sourceRoot;
|
||||
}
|
||||
|
||||
public File getTargetFile() {
|
||||
return targetFile;
|
||||
}
|
||||
|
||||
public void setTargetFile(File targetFile) {
|
||||
this.targetFile = targetFile;
|
||||
}
|
||||
|
||||
public void parse() throws Exception {
|
||||
targetFile = new File(rootDir,"org/nd4j/linalg/api/blas/BLASLapackDelegator.java");
|
||||
String packageName = "org.nd4j.linalg.api.blas";
|
||||
TypeSpec.Builder openblasLapackDelegator = TypeSpec.interfaceBuilder("BLASLapackDelegator");
|
||||
openblasLapackDelegator.addModifiers(Modifier.PUBLIC);
|
||||
Class<openblas> clazz = openblas.class;
|
||||
List<Method> objectMethods = Arrays.asList(Object.class.getMethods());
|
||||
Arrays.stream(clazz.getMethods())
|
||||
.filter(input -> !objectMethods.contains(input))
|
||||
.filter(input -> !input.getName().equals("map") && !input.getName().equals("init"))
|
||||
.filter(input -> !methodsToSkip.contains(input.getName()))
|
||||
.forEach(method -> {
|
||||
MethodSpec.Builder builder = MethodSpec.methodBuilder(
|
||||
method.getName()
|
||||
).returns(method.getReturnType())
|
||||
.addModifiers(Modifier.DEFAULT,Modifier.PUBLIC);
|
||||
Arrays.stream(method.getParameters()).forEach(param -> {
|
||||
builder.addParameter(ParameterSpec.builder(
|
||||
!lapackType(param.getType()) ?
|
||||
TypeName.get(param.getType()) :
|
||||
TypeName.get(Pointer.class),
|
||||
param.getName()
|
||||
).build());
|
||||
});
|
||||
|
||||
openblasLapackDelegator.addMethod(builder.build());
|
||||
});
|
||||
|
||||
JavaFile finalFile = JavaFile.builder(packageName, openblasLapackDelegator.build())
|
||||
.addFileComment(copyright)
|
||||
.build();
|
||||
finalFile
|
||||
.writeTo(rootDir);
|
||||
}
|
||||
|
||||
private boolean lapackType(Class<?> clazz) {
|
||||
return clazz.equals(openblas.LAPACK_C_SELECT1.class) ||
|
||||
clazz.equals(openblas.LAPACK_C_SELECT2.class) ||
|
||||
clazz.equals(openblas.LAPACK_D_SELECT2.class) ||
|
||||
clazz.equals(openblas.LAPACK_S_SELECT2.class) ||
|
||||
clazz.equals(openblas.LAPACK_Z_SELECT1.class)
|
||||
|| clazz.equals(openblas.LAPACK_Z_SELECT2.class) ||
|
||||
clazz.equals(openblas.LAPACK_D_SELECT3.class) ||
|
||||
clazz.equals(openblas.LAPACK_S_SELECT3.class);
|
||||
}
|
||||
|
||||
|
||||
private SourceRoot initSourceRoot(File nd4jApiRootDir) {
|
||||
CombinedTypeSolver typeSolver = new CombinedTypeSolver();
|
||||
typeSolver.add(new ReflectionTypeSolver(false));
|
||||
typeSolver.add(new JavaParserTypeSolver(nd4jApiRootDir));
|
||||
JavaSymbolSolver symbolSolver = new JavaSymbolSolver(typeSolver);
|
||||
StaticJavaParser.getConfiguration().setSymbolResolver(symbolSolver);
|
||||
SourceRoot sourceRoot = new SourceRoot(nd4jApiRootDir.toPath(),new ParserConfiguration().setSymbolResolver(symbolSolver));
|
||||
return sourceRoot;
|
||||
}
|
||||
|
||||
|
||||
public static void main(String...args) throws Exception {
|
||||
BlasLapackGenerator blasLapackGenerator = new BlasLapackGenerator(new File("../../nd4j/nd4j-backends/nd4j-api-parent/nd4j-api/src/main/java/"));
|
||||
blasLapackGenerator.parse();
|
||||
String generated = FileUtils.readFileToString(blasLapackGenerator.getTargetFile(), Charset.defaultCharset());
|
||||
generated = generated.replaceAll("\\{\\s+\\}",";");
|
||||
generated = generated.replace("default","");
|
||||
FileUtils.write(blasLapackGenerator.getTargetFile(),generated,Charset.defaultCharset());
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
+172
@@ -0,0 +1,172 @@
|
||||
/*
|
||||
* ******************************************************************************
|
||||
* *
|
||||
* *
|
||||
* * This program and the accompanying materials are made available under the
|
||||
* * terms of the Apache License, Version 2.0 which is available at
|
||||
* * https://www.apache.org/licenses/LICENSE-2.0.
|
||||
* *
|
||||
* * See the NOTICE file distributed with this work for additional
|
||||
* * information regarding copyright ownership.
|
||||
* * Unless required by applicable law or agreed to in writing, software
|
||||
* * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
* * License for the specific language governing permissions and limitations
|
||||
* * under the License.
|
||||
* *
|
||||
* * SPDX-License-Identifier: Apache-2.0
|
||||
* *****************************************************************************
|
||||
*/
|
||||
package org.deeplearning4j;
|
||||
|
||||
import com.github.javaparser.ParserConfiguration;
|
||||
import com.github.javaparser.StaticJavaParser;
|
||||
import com.github.javaparser.symbolsolver.JavaSymbolSolver;
|
||||
import com.github.javaparser.symbolsolver.resolution.typesolvers.CombinedTypeSolver;
|
||||
import com.github.javaparser.symbolsolver.resolution.typesolvers.JavaParserTypeSolver;
|
||||
import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver;
|
||||
import com.github.javaparser.utils.SourceRoot;
|
||||
import com.squareup.javapoet.*;
|
||||
import org.apache.commons.io.FileUtils;
|
||||
import org.bytedeco.javacpp.Pointer;
|
||||
import org.bytedeco.openblas.global.openblas;
|
||||
import org.bytedeco.openblas.global.openblas_nolapack;
|
||||
import org.nd4j.linalg.api.blas.BLASLapackDelegator;
|
||||
|
||||
import javax.lang.model.element.Modifier;
|
||||
import java.io.File;
|
||||
import java.lang.reflect.Method;
|
||||
import java.nio.charset.Charset;
|
||||
import java.util.*;
|
||||
|
||||
public class NoOpBlasLapackGenerator {
|
||||
|
||||
private SourceRoot sourceRoot;
|
||||
private File rootDir;
|
||||
private File targetFile;
|
||||
|
||||
|
||||
private static String copyright =
|
||||
"/*\n" +
|
||||
" * ******************************************************************************\n" +
|
||||
" * *\n" +
|
||||
" * *\n" +
|
||||
" * * This program and the accompanying materials are made available under the\n" +
|
||||
" * * terms of the Apache License, Version 2.0 which is available at\n" +
|
||||
" * * https://www.apache.org/licenses/LICENSE-2.0.\n" +
|
||||
" * *\n" +
|
||||
" * * See the NOTICE file distributed with this work for additional\n" +
|
||||
" * * information regarding copyright ownership.\n" +
|
||||
" * * Unless required by applicable law or agreed to in writing, software\n" +
|
||||
" * * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n" +
|
||||
" * * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n" +
|
||||
" * * License for the specific language governing permissions and limitations\n" +
|
||||
" * * under the License.\n" +
|
||||
" * *\n" +
|
||||
" * * SPDX-License-Identifier: Apache-2.0\n" +
|
||||
" * *****************************************************************************\n" +
|
||||
" */\n";
|
||||
private static String codeGenWarning =
|
||||
"\n//================== GENERATED CODE - DO NOT MODIFY THIS FILE ==================\n\n";
|
||||
|
||||
|
||||
public NoOpBlasLapackGenerator(File nd4jApiRootDir) {
|
||||
this.sourceRoot = initSourceRoot(nd4jApiRootDir);
|
||||
this.rootDir = nd4jApiRootDir;
|
||||
}
|
||||
|
||||
|
||||
public void parse() throws Exception {
|
||||
targetFile = new File(rootDir,"org/nd4j/linalg/cpu/nativecpu/blas/NoOpBLASDelegator.java");
|
||||
String packageName = "org.nd4j.linalg.cpu.nativecpu.blas";
|
||||
TypeSpec.Builder openblasLapackDelegator = TypeSpec.classBuilder("NoOpBLASDelegator");
|
||||
openblasLapackDelegator.addModifiers(Modifier.PUBLIC);
|
||||
openblasLapackDelegator.addSuperinterface(BLASLapackDelegator.class);
|
||||
|
||||
Class<BLASLapackDelegator> clazz = BLASLapackDelegator.class;
|
||||
List<Method> objectMethods = Arrays.asList(Object.class.getMethods());
|
||||
Set<MethodSpec> addedCodeLines = new HashSet<>();
|
||||
Arrays.stream(clazz.getMethods())
|
||||
.filter(input -> !objectMethods.contains(input))
|
||||
.forEach(method -> {
|
||||
MethodSpec.Builder builder = MethodSpec.methodBuilder(
|
||||
method.getName()
|
||||
).addModifiers(Modifier.PUBLIC)
|
||||
.returns(method.getReturnType())
|
||||
.addAnnotation(Override.class);
|
||||
StringBuilder codeStatement = new StringBuilder();
|
||||
//don't return anything when void
|
||||
if(method.getReturnType().equals(Void.TYPE)) {
|
||||
|
||||
} else if(method.getReturnType().equals(int.class)){
|
||||
codeStatement.append("return 0;");
|
||||
|
||||
} else if(method.getReturnType().equals(double.class)) {
|
||||
codeStatement.append("return 0.0;");
|
||||
|
||||
} else if(method.getReturnType().equals(float.class)) {
|
||||
codeStatement.append("return 0.0f;");
|
||||
|
||||
}
|
||||
else if(method.getReturnType().equals(long.class)) {
|
||||
codeStatement.append("return 0L;");
|
||||
}
|
||||
|
||||
Arrays.stream(method.getParameters()).forEach(param -> {
|
||||
builder.addParameter(ParameterSpec.builder(param.getType(),param.getName())
|
||||
.build());
|
||||
|
||||
});
|
||||
|
||||
|
||||
builder.addCode(CodeBlock
|
||||
.builder()
|
||||
.addStatement(codeStatement.toString().replace(",)",")"))
|
||||
.build());
|
||||
|
||||
MethodSpec build = builder.build();
|
||||
openblasLapackDelegator.addMethod(build);
|
||||
addedCodeLines.add(build);
|
||||
|
||||
|
||||
});
|
||||
|
||||
JavaFile.builder(packageName,openblasLapackDelegator.build())
|
||||
.addFileComment(copyright)
|
||||
.build()
|
||||
.writeTo(rootDir);
|
||||
}
|
||||
|
||||
|
||||
private SourceRoot initSourceRoot(File nd4jApiRootDir) {
|
||||
CombinedTypeSolver typeSolver = new CombinedTypeSolver();
|
||||
typeSolver.add(new ReflectionTypeSolver(false));
|
||||
typeSolver.add(new JavaParserTypeSolver(nd4jApiRootDir));
|
||||
JavaSymbolSolver symbolSolver = new JavaSymbolSolver(typeSolver);
|
||||
StaticJavaParser.getConfiguration().setSymbolResolver(symbolSolver);
|
||||
SourceRoot sourceRoot = new SourceRoot(nd4jApiRootDir.toPath(),new ParserConfiguration().setSymbolResolver(symbolSolver));
|
||||
return sourceRoot;
|
||||
}
|
||||
|
||||
public SourceRoot getSourceRoot() {
|
||||
return sourceRoot;
|
||||
}
|
||||
|
||||
public File getRootDir() {
|
||||
return rootDir;
|
||||
}
|
||||
|
||||
public File getTargetFile() {
|
||||
return targetFile;
|
||||
}
|
||||
|
||||
public static void main(String...args) throws Exception {
|
||||
NoOpBlasLapackGenerator openblasBlasLapackGenerator = new NoOpBlasLapackGenerator(new File("nd4j/nd4j-backends/nd4j-backend-impls/nd4j-cpu-backend-common/src/main/java"));
|
||||
openblasBlasLapackGenerator.parse();
|
||||
String generated = FileUtils.readFileToString(openblasBlasLapackGenerator.getTargetFile(), Charset.defaultCharset());
|
||||
generated = generated.replace(";;",";");
|
||||
FileUtils.write(openblasBlasLapackGenerator.getTargetFile(),generated);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
+286
@@ -0,0 +1,286 @@
|
||||
/*
|
||||
* ******************************************************************************
|
||||
* *
|
||||
* *
|
||||
* * This program and the accompanying materials are made available under the
|
||||
* * terms of the Apache License, Version 2.0 which is available at
|
||||
* * https://www.apache.org/licenses/LICENSE-2.0.
|
||||
* *
|
||||
* * See the NOTICE file distributed with this work for additional
|
||||
* * information regarding copyright ownership.
|
||||
* * Unless required by applicable law or agreed to in writing, software
|
||||
* * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
* * License for the specific language governing permissions and limitations
|
||||
* * under the License.
|
||||
* *
|
||||
* * SPDX-License-Identifier: Apache-2.0
|
||||
* *****************************************************************************
|
||||
*/
|
||||
package org.deeplearning4j;
|
||||
|
||||
import com.github.javaparser.ParserConfiguration;
|
||||
import com.github.javaparser.StaticJavaParser;
|
||||
import com.github.javaparser.symbolsolver.JavaSymbolSolver;
|
||||
import com.github.javaparser.symbolsolver.resolution.typesolvers.CombinedTypeSolver;
|
||||
import com.github.javaparser.symbolsolver.resolution.typesolvers.JavaParserTypeSolver;
|
||||
import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver;
|
||||
import com.github.javaparser.utils.SourceRoot;
|
||||
import com.squareup.javapoet.*;
|
||||
import org.apache.commons.io.FileUtils;
|
||||
import org.bytedeco.javacpp.Pointer;
|
||||
import org.bytedeco.openblas.global.openblas;
|
||||
import org.bytedeco.openblas.global.openblas_nolapack;
|
||||
import org.nd4j.linalg.api.blas.BLASLapackDelegator;
|
||||
import org.nd4j.shade.guava.collect.HashBasedTable;
|
||||
import org.nd4j.shade.guava.collect.Table;
|
||||
|
||||
import javax.lang.model.element.Modifier;
|
||||
import java.io.File;
|
||||
import java.lang.reflect.Method;
|
||||
import java.nio.charset.Charset;
|
||||
import java.util.*;
|
||||
|
||||
public class OpenblasBlasLapackGenerator {
|
||||
|
||||
private SourceRoot sourceRoot;
|
||||
private File rootDir;
|
||||
private File targetFile;
|
||||
|
||||
private Map<String,String> casting = new HashMap<>() {{
|
||||
put("LAPACKE_sgees", "openblas.LAPACK_S_SELECT2");
|
||||
put("LAPACKE_dgees", "openblas.LAPACK_D_SELECT2");
|
||||
put("LAPACKE_cgees", "openblas.LAPACK_C_SELECT1");
|
||||
put("LAPACKE_zgees", "openblas.LAPACK_Z_SELECT1");
|
||||
put("LAPACKE_sgeesx", "openblas.LAPACK_S_SELECT2");
|
||||
put("LAPACKE_dgeesx", "openblas.LAPACK_D_SELECT2");
|
||||
put("LAPACKE_cgeesx", "openblas.LAPACK_C_SELECT1");
|
||||
put("LAPACKE_zgeesx", "openblas.LAPACK_Z_SELECT1");
|
||||
put("LAPACKE_sgges", "openblas.LAPACK_S_SELECT3");
|
||||
put("LAPACKE_dgges", "openblas.LAPACK_D_SELECT3");
|
||||
put("LAPACKE_cgges", "openblas.LAPACK_C_SELECT2");
|
||||
put("LAPACKE_zgges", "openblas.LAPACK_Z_SELECT2");
|
||||
put("LAPACKE_sgges3", "openblas.LAPACK_S_SELECT3");
|
||||
put("LAPACKE_dgges3", "openblas.LAPACK_D_SELECT3");
|
||||
put("LAPACKE_cgges3", "openblas.LAPACK_C_SELECT2");
|
||||
put("LAPACKE_zgges3", "openblas.LAPACK_Z_SELECT2");
|
||||
put("LAPACKE_sggesx", "openblas.LAPACK_S_SELECT3");
|
||||
put("LAPACKE_dggesx", "openblas.LAPACK_D_SELECT3");
|
||||
put("LAPACKE_cggesx", "openblas.LAPACK_C_SELECT2");
|
||||
put("LAPACKE_zggesx", "openblas.LAPACK_Z_SELECT2");
|
||||
put("LAPACKE_sgees_work", "openblas.LAPACK_S_SELECT2");
|
||||
put("LAPACKE_dgees_work", "openblas.LAPACK_D_SELECT2");
|
||||
put("LAPACKE_cgees_work", "openblas.LAPACK_C_SELECT1");
|
||||
put("LAPACKE_zgees_work", "openblas.LAPACK_Z_SELECT1");
|
||||
put("LAPACKE_sgeesx_work", "openblas.LAPACK_S_SELECT2");
|
||||
put("LAPACKE_dgeesx_work", "openblas.LAPACK_D_SELECT2");
|
||||
put("LAPACKE_cgeesx_work", "openblas.LAPACK_C_SELECT1");
|
||||
put("LAPACKE_zgeesx_work", "openblas.LAPACK_Z_SELECT1");
|
||||
put("LAPACKE_sgges_work", "openblas.LAPACK_S_SELECT3");
|
||||
put("LAPACKE_dgges_work", "openblas.LAPACK_D_SELECT3");
|
||||
put("LAPACKE_cgges_work", "openblas.LAPACK_C_SELECT2");
|
||||
put("LAPACKE_zgges_work", "openblas.LAPACK_Z_SELECT2");
|
||||
put("LAPACKE_sgges3_work", "openblas.LAPACK_S_SELECT3");
|
||||
put("LAPACKE_dgges3_work", "openblas.LAPACK_D_SELECT3");
|
||||
put("LAPACKE_cgges3_work", "openblas.LAPACK_C_SELECT2");
|
||||
put("LAPACKE_zgges3_work", "openblas.LAPACK_Z_SELECT2");
|
||||
put("LAPACKE_sggesx_work", "openblas.LAPACK_S_SELECT3");
|
||||
put("LAPACKE_dggesx_work", "openblas.LAPACK_D_SELECT3");
|
||||
put("LAPACKE_cggesx_work", "openblas.LAPACK_C_SELECT2");
|
||||
put("LAPACKE_zggesx_work", "openblas.LAPACK_Z_SELECT2");
|
||||
|
||||
put("LAPACK_sgges3_base", "openblas.LAPACK_S_SELECT3");
|
||||
put("LAPACK_dgges3_base", "openblas.LAPACK_D_SELECT3");
|
||||
put("LAPACK_cgges3_base", "openblas.LAPACK_C_SELECT2");
|
||||
put("LAPACK_zgges3_base", "openblas.LAPACK_Z_SELECT2");
|
||||
|
||||
|
||||
put("LAPACK_sgges_base", "openblas.LAPACK_S_SELECT3");
|
||||
put("LAPACK_dgges_base", "openblas.LAPACK_D_SELECT3");
|
||||
put("LAPACK_cgges_base", "openblas.LAPACK_C_SELECT2");
|
||||
put("LAPACK_zgges_base", "openblas.LAPACK_Z_SELECT2");
|
||||
|
||||
|
||||
put("LAPACK_sggesx_base", "openblas.LAPACK_S_SELECT3");
|
||||
put("LAPACK_dggesx_base", "openblas.LAPACK_D_SELECT3");
|
||||
put("LAPACK_cggesx_base", "openblas.LAPACK_C_SELECT2");
|
||||
put("LAPACK_zggesx_base", "openblas.LAPACK_Z_SELECT2");
|
||||
|
||||
//LAPACK_zgeesx
|
||||
put("LAPACK_cgees_base", "openblas.LAPACK_C_SELECT1");
|
||||
put("LAPACK_dgees_base", "openblas.LAPACK_D_SELECT2");
|
||||
put("LAPACK_zgees_base", "openblas.LAPACK_Z_SELECT1");
|
||||
put("LAPACK_sgees_base", "openblas.LAPACK_S_SELECT2");
|
||||
|
||||
|
||||
put("LAPACK_cgeesx_base", "openblas.LAPACK_C_SELECT1");
|
||||
put("LAPACK_dgeesx_base", "openblas.LAPACK_D_SELECT2");
|
||||
put("LAPACK_zgeesx_base", "openblas.LAPACK_Z_SELECT1");
|
||||
put("LAPACK_sgeesx_base", "openblas.LAPACK_S_SELECT2");
|
||||
|
||||
}};
|
||||
private static String copyright =
|
||||
"/*\n" +
|
||||
" * ******************************************************************************\n" +
|
||||
" * *\n" +
|
||||
" * *\n" +
|
||||
" * * This program and the accompanying materials are made available under the\n" +
|
||||
" * * terms of the Apache License, Version 2.0 which is available at\n" +
|
||||
" * * https://www.apache.org/licenses/LICENSE-2.0.\n" +
|
||||
" * *\n" +
|
||||
" * * See the NOTICE file distributed with this work for additional\n" +
|
||||
" * * information regarding copyright ownership.\n" +
|
||||
" * * Unless required by applicable law or agreed to in writing, software\n" +
|
||||
" * * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n" +
|
||||
" * * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n" +
|
||||
" * * License for the specific language governing permissions and limitations\n" +
|
||||
" * * under the License.\n" +
|
||||
" * *\n" +
|
||||
" * * SPDX-License-Identifier: Apache-2.0\n" +
|
||||
" * *****************************************************************************\n" +
|
||||
" */\n";
|
||||
private static String codeGenWarning =
|
||||
"\n//================== GENERATED CODE - DO NOT MODIFY THIS FILE ==================\n\n";
|
||||
|
||||
|
||||
public OpenblasBlasLapackGenerator(File nd4jApiRootDir) {
|
||||
this.sourceRoot = initSourceRoot(nd4jApiRootDir);
|
||||
this.rootDir = nd4jApiRootDir;
|
||||
}
|
||||
|
||||
public void parse() throws Exception {
|
||||
targetFile = new File(rootDir,"org/nd4j/linalg/cpu/nativecpu/OpenblasLapackDelegator.java");
|
||||
String packageName = "org.nd4j.linalg.cpu.nativecpu";
|
||||
TypeSpec.Builder openblasLapackDelegator = TypeSpec.classBuilder("OpenblasLapackDelegator");
|
||||
openblasLapackDelegator.addModifiers(Modifier.PUBLIC);
|
||||
openblasLapackDelegator.addSuperinterface(BLASLapackDelegator.class);
|
||||
|
||||
Class<BLASLapackDelegator> clazz = BLASLapackDelegator.class;
|
||||
List<Method> objectMethods = Arrays.asList(Object.class.getMethods());
|
||||
Set<MethodSpec> addedCodeLines = new HashSet<>();
|
||||
Arrays.stream(clazz.getMethods())
|
||||
.filter(input -> !objectMethods.contains(input))
|
||||
.forEach(method -> {
|
||||
MethodSpec.Builder builder = MethodSpec.methodBuilder(
|
||||
method.getName()
|
||||
).addModifiers(Modifier.PUBLIC)
|
||||
.returns(method.getReturnType())
|
||||
.addAnnotation(Override.class);
|
||||
StringBuilder codeStatement = new StringBuilder();
|
||||
//don't return anything when void
|
||||
if(method.getReturnType().equals(Void.TYPE)) {
|
||||
codeStatement.append("openblas." + method.getName() + "(");
|
||||
|
||||
} else if(method.getReturnType().equals(int.class)) {
|
||||
codeStatement.append("return openblas." + method.getName() + "(");
|
||||
|
||||
} else if(method.getReturnType().equals(double.class)) {
|
||||
//codeStatement.append("return 0.0;");
|
||||
codeStatement.append("return openblas." + method.getName() + "(");
|
||||
|
||||
} else if(method.getReturnType().equals(float.class)) {
|
||||
//codeStatement.append("return 0.0f;");
|
||||
codeStatement.append("return openblas." + method.getName() + "(");
|
||||
|
||||
}
|
||||
else if(method.getReturnType().equals(long.class)) {
|
||||
//codeStatement.append("return 0L;");
|
||||
codeStatement.append("return openblas." + method.getName() + "(");
|
||||
|
||||
}
|
||||
|
||||
//TODO: LAPACK_cgees
|
||||
//TODO: LAPACK_dgees
|
||||
//TODO: LAPACK_zgees
|
||||
//TODO: LAPACK_cgeesx
|
||||
//TODO: LAPACK_dgeesx
|
||||
//TODO: LAPACK_sgeesx
|
||||
//TODO: LAPACK_zgeesx
|
||||
//TODO: LAPACK_cgges
|
||||
//TODO: LAPACK_dgges
|
||||
//TODO: LAPACK_sgges
|
||||
//TODO: LAPACK_zgges
|
||||
//TODO: LAPACK_cgges3
|
||||
//TODO: LAPACK_dgges3
|
||||
//TODO: LAPACK_sgges3
|
||||
//TODO: LAPACK_zgges3
|
||||
//TODO: LAPACK_cggesx
|
||||
//TODO: LAPACK_dggesx
|
||||
//TODO: LAPACK_sggesx
|
||||
//TODO: LAPACK_zggesx
|
||||
|
||||
|
||||
//TODO: issue could be LAPACK_Z_SELECT_2
|
||||
//TODO: LAPACK_S_SELECT_3
|
||||
Arrays.stream(method.getParameters()).forEach(param -> {
|
||||
if(casting.containsKey(method.getName()) && param.getType().equals(Pointer.class)) {
|
||||
System.out.println("In function casting for " + method.getName());
|
||||
codeStatement.append("((" + casting.get(method.getName()) + ")" + param.getName() + ")");
|
||||
codeStatement.append(",");
|
||||
} else {
|
||||
codeStatement.append(param.getName());
|
||||
codeStatement.append(",");
|
||||
}
|
||||
|
||||
builder.addParameter(ParameterSpec.builder(param.getType(),param.getName())
|
||||
.build());
|
||||
|
||||
});
|
||||
|
||||
codeStatement.append(")");
|
||||
|
||||
builder.addCode(CodeBlock
|
||||
.builder()
|
||||
.addStatement(codeStatement.toString().replace(",)",")"))
|
||||
.build());
|
||||
|
||||
MethodSpec build = builder.build();
|
||||
openblasLapackDelegator.addMethod(build);
|
||||
addedCodeLines.add(build);
|
||||
|
||||
|
||||
});
|
||||
|
||||
JavaFile.builder(packageName,openblasLapackDelegator.build())
|
||||
.addFileComment(copyright)
|
||||
.addStaticImport(openblas.class,"*")
|
||||
.addStaticImport(openblas_nolapack.class,"*")
|
||||
.build()
|
||||
.writeTo(rootDir);
|
||||
}
|
||||
|
||||
|
||||
private SourceRoot initSourceRoot(File nd4jApiRootDir) {
|
||||
CombinedTypeSolver typeSolver = new CombinedTypeSolver();
|
||||
typeSolver.add(new ReflectionTypeSolver(false));
|
||||
typeSolver.add(new JavaParserTypeSolver(nd4jApiRootDir));
|
||||
JavaSymbolSolver symbolSolver = new JavaSymbolSolver(typeSolver);
|
||||
StaticJavaParser.getConfiguration().setSymbolResolver(symbolSolver);
|
||||
SourceRoot sourceRoot = new SourceRoot(nd4jApiRootDir.toPath(),new ParserConfiguration().setSymbolResolver(symbolSolver));
|
||||
return sourceRoot;
|
||||
}
|
||||
|
||||
public SourceRoot getSourceRoot() {
|
||||
return sourceRoot;
|
||||
}
|
||||
|
||||
public File getRootDir() {
|
||||
return rootDir;
|
||||
}
|
||||
|
||||
public File getTargetFile() {
|
||||
return targetFile;
|
||||
}
|
||||
|
||||
public static void main(String...args) throws Exception {
|
||||
OpenblasBlasLapackGenerator openblasBlasLapackGenerator = new OpenblasBlasLapackGenerator(new File("nd4j/nd4j-backends/nd4j-backend-impls/nd4j-native/src/main/java"));
|
||||
openblasBlasLapackGenerator.parse();
|
||||
String generated = FileUtils.readFileToString(openblasBlasLapackGenerator.getTargetFile(), Charset.defaultCharset());
|
||||
generated = generated.replace(";;",";");
|
||||
generated = generated.replaceAll("import static org.bytedeco.openblas.global.openblas\\.\\*","import org.bytedeco.openblas.global.openblas");
|
||||
generated = generated.replaceAll("import static org.bytedeco.openblas.global.openblas_nolapack\\.\\*","import org.bytedeco.openblas.global.openblas_nolapack");
|
||||
FileUtils.write(openblasBlasLapackGenerator.getTargetFile(),generated,Charset.defaultCharset());
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user