Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
176 changes: 176 additions & 0 deletions matrix/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,176 @@
<?xml version="1.0" encoding="UTF-8"?>
<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>

<parent>
<groupId>com.gluonhq.samples</groupId>
<artifactId>samples</artifactId>
<version>1.0.0-SNAPSHOT</version>
</parent>

<artifactId>matrix</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>jar</packaging>

<name>Matrix</name>

<properties>
<main.class>com.gluonhq.samples.matrix.Main</main.class>
<javacpp.version>1.5.4</javacpp.version>
<dl4j.version>1.0.0-beta7</dl4j.version>
</properties>

<dependencies>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-controls</artifactId>
<version>${javafx.version}</version>
</dependency>
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>javacpp</artifactId>
<version>${javacpp.version}</version>
<classifier>${cl}</classifier>
</dependency>
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>javacpp</artifactId>
<version>${javacpp.version}</version>
</dependency>
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>openblas</artifactId>
<version>0.3.10-${javacpp.version}</version>
<classifier>${cl}</classifier>
</dependency>
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>openblas</artifactId>
<version>0.3.10-${javacpp.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-nop</artifactId>
<version>1.7.26</version>
</dependency>
<dependency>
<groupId>org.nd4j</groupId>
<artifactId>nd4j-native</artifactId>
<version>${dl4j.version}</version>
<classifier>${cl}</classifier>
</dependency>
<dependency>
<groupId>org.nd4j</groupId>
<artifactId>nd4j-native</artifactId>
<version>${dl4j.version}</version>
</dependency>
<dependency>
<groupId>com.gluonhq</groupId>
<artifactId>charm-glisten</artifactId>
<version>${charm.version}</version>
</dependency>
<dependency>
<groupId>com.gluonhq.attach</groupId>
<artifactId>display</artifactId>
<version>${attach.version}</version>
</dependency>
<dependency>
<groupId>com.gluonhq.attach</groupId>
<artifactId>lifecycle</artifactId>
<version>${attach.version}</version>
</dependency>
<dependency>
<groupId>com.gluonhq.attach</groupId>
<artifactId>statusbar</artifactId>
<version>${attach.version}</version>
</dependency>
<dependency>
<groupId>com.gluonhq.attach</groupId>
<artifactId>storage</artifactId>
<version>${attach.version}</version>
</dependency>
<dependency>
<groupId>com.gluonhq.attach</groupId>
<artifactId>util</artifactId>
<version>${attach.version}</version>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
</plugin>

<plugin>
<groupId>org.openjfx</groupId>
<artifactId>javafx-maven-plugin</artifactId>
<version>${javafx.maven.plugin.version}</version>
<configuration>
<mainClass>${main.class}</mainClass>
<includePathExceptionsInClasspath>true</includePathExceptionsInClasspath>
<!--
<options>
<option>-agentlib:native-image-agent=config-merge-dir=src/main/resources/META-INF/native-image</option>
</options>
-->
</configuration>
</plugin>

<plugin>
<groupId>com.gluonhq</groupId>
<artifactId>client-maven-plugin</artifactId>
<version>${client.maven.plugin.version}</version>
<configuration>
<target>${client.target}</target>
<mainClass>${main.class}</mainClass>
<resourcesList>
<item>nd4j-native.properties</item>
</resourcesList>
<attachList>
<list>display</list>
<list>lifecycle</list>
<list>statusbar</list>
<list>storage</list>
</attachList>
</configuration>
</plugin>
</plugins>
</build>

<profiles>
<profile>
<id>desktop</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<client.target>host</client.target>
<cl>linux-x86_64</cl>
<cl>macosx-x86_64</cl>
</properties>
</profile>
<profile>
<id>ios</id>
<properties>
<client.target>ios</client.target>
</properties>
</profile>
<profile>
<id>android</id>
<properties>
<client.target>android</client.target>
<cl>android-arm64</cl>
</properties>
</profile>
</profiles>

<repositories>
<repository>
<id>gluon-releases</id>
<url>https://nexus.gluonhq.com/nexus/content/repositories/releases/</url>
</repository>
</repositories>
</project>
128 changes: 128 additions & 0 deletions matrix/src/main/java/com/gluonhq/samples/matrix/Main.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,128 @@
package com.gluonhq.samples.matrix;

import com.gluonhq.attach.display.DisplayService;
import com.gluonhq.attach.util.Platform;
import com.gluonhq.charm.glisten.application.MobileApplication;
import com.gluonhq.charm.glisten.control.AppBar;
import com.gluonhq.charm.glisten.control.FloatingActionButton;
import com.gluonhq.charm.glisten.mvc.View;
import com.gluonhq.charm.glisten.visual.MaterialDesignIcon;
import com.gluonhq.charm.glisten.visual.Swatch;
import org.nd4j.linalg.api.buffer.DataType;
import org.nd4j.linalg.api.ndarray.INDArray;
import org.nd4j.linalg.factory.Nd4j;

import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.geometry.Dimension2D;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.chart.Chart;
import javafx.scene.chart.LineChart;
import javafx.scene.control.Label;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.XYChart;
import javafx.scene.chart.XYChart.Series;

public class Main extends MobileApplication {

Series<Number, Number> series = new Series<>();

@Override
public void init() {
addViewFactory(HOME_VIEW, () -> {
FloatingActionButton fab = new FloatingActionButton(MaterialDesignIcon.SEARCH.text,
e -> System.out.println("Search"));

Chart chart = createChart();

Label label = new Label("Hello, ND4J with Gluon Mobile!");

VBox root = new VBox(20, chart, label);
root.setAlignment(Pos.CENTER);

View view = new View(root) {
@Override
protected void updateAppBar(AppBar appBar) {
appBar.setTitleText("Gluon Mobile and ND4J");
}
};

fab.showOn(view);

return view;
});
train();
}
@Override
public void postInit(Scene scene) {
Swatch.LIGHT_GREEN.assignTo(scene);
scene.getStylesheets().add(Main.class.getResource("styles.css").toExternalForm());

if (Platform.isDesktop()) {
Dimension2D dimension2D = DisplayService.create()
.map(DisplayService::getDefaultDimensions)
.orElse(new Dimension2D(640, 480));
scene.getWindow().setWidth(dimension2D.getWidth());
scene.getWindow().setHeight(dimension2D.getHeight());
}
}

private long multiplyMatrix(int dim) {
double[] a = new double[dim * dim];
double[] b = new double[dim * dim];
for (int i = 0; i < dim * dim; i++) {
a[i] = Math.random()-.5;
b[i] = Math.random()-.5;
}
long s0 = System.currentTimeMillis();
INDArray na = Nd4j.create(a,new int[]{dim,dim});
INDArray nb = Nd4j.create(b,new int[]{dim,dim});
INDArray nc = na.mmul(nb);
long s1 = System.currentTimeMillis();
long d = s1-s0;
return d;
}

private void train() {
Thread thread = new Thread(){
@Override public void run() {
double warmup = multiplyMatrix(1);
warmup = multiplyMatrix(5);
for (int i = 2; i < 40; i++) {
double t = multiplyMatrix(10*i);
final int x = 10*i;
final double y = t;
System.err.println("points "+i+", "+y);
javafx.application.Platform.runLater(() -> series.getData().add(new XYChart.Data(x, y)));
}
}
};
thread.start();
}

private Chart createChart() {
NumberAxis xAxis = new NumberAxis();
NumberAxis yAxis = new NumberAxis();
xAxis.setLabel("matrix dimension");
yAxis.setLabel("Time (ms)");
series.setName("nd4j");
LineChart<Number, Number> lineChart = new LineChart(xAxis, yAxis);
ObservableList<XYChart.Series<Number, Number>> chartData = FXCollections.observableArrayList();
chartData.add(series);
lineChart.setData(chartData);
return lineChart;
}

public static void main(String[] args) {
if (Platform.isAndroid()) {
System.setProperty("org.bytedeco.javacpp.platform", "arm64-v8a");
System.setProperty("org.bytedeco.javacpp.platform.library.path", "/lib");
System.setProperty("org.bytedeco.javacpp.pathsFirst", "true");
}
launch(args);
}
}
18 changes: 18 additions & 0 deletions matrix/src/main/resources/META-INF/native-image/jni-config.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
[
{
"name":"java.lang.ClassLoader",
"methods":[
{"name":"getPlatformClassLoader","parameterTypes":[] },
{"name":"loadClass","parameterTypes":["java.lang.String"] }
]
},
{
"name":"java.lang.ClassNotFoundException"
},
{
"name":"java.lang.NoSuchMethodError"
},
{
"name":"java.lang.String"
}
]
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
[
]
Loading