Java Statistical Analysis Tool, a Java library for Machine Learning

Overview

Java Statistical Analysis Tool

JSAT is a library for quickly getting started with Machine Learning problems. It is developed in my free time, and made available for use under the GPL 3. Part of the library is for self education, as such - all code is self contained. JSAT has no external dependencies, and is pure Java. I also aim to make the library suitably fast for small to medium size problems. As such, much of the code supports parallel execution.

The current master branch of JSAT is going through a larger refactoring as JSAT moves to Java 8. This may cause some examples to break if used against the head version, but they should be fixible with minimal changes.

Get JSAT

Ther current release of JSAT is version 0.0.9, and supports Java 6. The current master branch is now Java 8+.

You can download JSAT from maven central, add the below to your pom file

<dependencies>
  <dependency>
    <groupId>com.edwardraff</groupId>
    <artifactId>JSAT</artifactId>
    <version>0.0.9</version>
  </dependency>
</dependencies>

If you want to use the bleeding edge, but don't want to bother building yourself, I recommend you look at jitpack.io. It can build a POM repo for you for any specific commit version. Click on "Commits" in the link and then click "get it" for the commit version you want.

If you want to read the javadoc's online, you can find them hosted on my website here.

Why use JSAT?

For research and specialized needs, JSAT has one of the largest collections of algorithms available in any framework. See an incomplete list here.

Additional, there are unfortunately not as many ML tools for Java as there are for other languages. Compared to Weka, JSAT is usually faster.

If you want to use JSAT and the GPL is not something that will work for you, let me know and we can discuss the issue.

See the wiki for more information as well as some examples on how to use JSAT.

Note

Updates to JSAT may be slowed as I begin a PhD program in Computer Science. The project isn’t abandoned! I just have limited free time, and will be balancing my PhD work with a full time job. If you discover more hours in the day, please let me know! Development will be further slowed due to some health issues. I'll continue to try and be prompt on any bug reports and emails, but new features will be a bit slower. Please use the github issues first for contact.

Citations

If you use JSAT and find it helpful, citations are appreciated! Please cite the JSAT paper published at JMLR. If you're feeling a little lazy, the bibtex is below:

@article{JMLR:v18:16-131,
author = {Raff, Edward},
journal = {Journal of Machine Learning Research},
number = {23},
pages = {1--5},
title = {JSAT: Java Statistical Analysis Tool, a Library for Machine Learning},
url = {http://jmlr.org/papers/v18/16-131.html},
volume = {18},
year = {2017}
}
Comments
  • Tests fail

    Tests fail

    The following tests fail with windows and jdk 1.8 (I don't think this is windows or java related ;) ):

    Failed tests: ElkanKMeansTest.testCluster_3args_2:106 expected:<3> but was:<4> RandomBallCoverTest.testSearch_Vec_double:114 jsat.linear.vectorcollection.RandomBallCover$RandomBallCoverFactory failed expected:<14> but was:<13> RandomBallCoverTest.testSearch_Vec_int:168 jsat.linear.vectorcollection.RandomBallCover$RandomBallCoverFactory failed 10 VPTreeMVTest.testSearch_Vec_int:171 jsat.linear.vectorcollection.VPTreeMV$VPTreeMVFactory failed 10 VPTreeTest.testSearch_Vec_double:113 jsat.linear.vectorcollection.VPTree$VPTreeFactory failed expected:<12> but was:<11> VPTreeTest.testSearch_Vec_int:167 jsat.linear.vectorcollection.VPTree$VPTreeFactory failed 1 FastMathTest.testPow:152 null

    EDIT: It seems that some of the tests sometimes fail and sometimes pass. I did not have a closer look but maybe there are some random issues in the tests. This time I got the following result:

    Failed tests: NewGLMNETTest.testSetC:109 null ElkanKMeansTest.testCluster_3args_2:106 expected:<3> but was:<4> NaiveKMeansTest.testCluster_3args_1:89 expected:<10> but was:<9> RandomBallCoverTest.testSearch_Vec_double:114 jsat.linear.vectorcollection.RandomBallCover$RandomBallCoverFactory failed expected:<14> but was:<7> RandomBallCoverTest.testSearch_Vec_int:168 jsat.linear.vectorcollection.RandomBallCover$RandomBallCoverFactory failed 20 VPTreeMVTest.testSearch_Vec_double:114 jsat.linear.vectorcollection.VPTreeMV$VPTreeMVFactory failed expected:<13> but was:<0> VPTreeMVTest.testSearch_Vec_int:171 jsat.linear.vectorcollection.VPTreeMV$VPTreeMVFactory failed 2 VPTreeTest.testSearch_Vec_double:113 jsat.linear.vectorcollection.VPTree$VPTreeFactory failed expected:<13> but was:<0> VPTreeTest.testSearch_Vec_int:167 jsat.linear.vectorcollection.VPTree$VPTreeFactory failed 1 Tests in error: PegasosKTest.testTrainC_ClassificationDataSet_ExecutorService:68 » FailedToFit DivisiveGlobalClustererTest.testCluster_DataSet_int_int_ExecutorService:129 » ArrayIndexOutOfBounds MiniBatchKMeansTest.testCluster_3args_1:94 » IndexOutOfBounds Index: 0, Size: ...

    opened by TKlerx 16
  • Unit tests fail (randomly?)

    Unit tests fail (randomly?)

    I ran the unit tests a few times in a row, and each time, a different set of 1 to 3 of them failed.

    testTrainC_ClassificationDataSet(jsat.classifiers.trees.RandomForestTest) Time elapsed: 0.242 sec <<< FAILURE! testSearch_Vec_int(jsat.linear.vectorcollection.RandomBallCoverTest) Time elapsed: 0.013 sec <<< FAILURE!

    opened by salamanders 15
  • Continuous Integration with Travis

    Continuous Integration with Travis

    Hi there,

    I've just forked the project and wanted to make sure that it would compile. I've added a CI build with travis so that all the code is compiled and the tests also run.

    I have this building on my fork but it would be better if you go to travis-ci.org and enable travis build for your repo to get the building working from the base. It will help with future pull requests to know there are no breaking changes

    (Note: Once It's enabled, then just update the README to point to your own travis build instead of https://travis-ci.org/martingollogly/JSAT )

    opened by melantronic 13
  • Build problem in Eclipse environment

    Build problem in Eclipse environment

    Thank you for sharing the great job you have done with the community.

    While build works with Maven, I had a trouble compiling the code from Eclipse (Luna, Java 1.8). For methods loadSimple, loadClassification and loadRegression of class JSATData, compilation failed in the casts of load method response, e.g: return (SimpleDataSet) load(inRaw, true)); Compile error is: Cannot cast from DataSet<DataSet<DataSet>> to SimpleDataSet

    Guess it's specific to my dev environment, so I'm not sending a pull request but just sharing a workaround with "double casting":

    return (SimpleDataSet) ((DataSet<?>)load(inRaw, true));

    opened by NikolaMorena 10
  • Save and load RandomForest

    Save and load RandomForest

    Hi, I would like to save and load the result of the RandomForest training. When I used Java serialization and I got an Exception since getParam in the Parameter class creates Parameter Object that contains a Method field member (the getMethod variable is final and saved as part of the created Parameter object). The same happend when I used FST. I also tried to use Kryo but got an Exception since RandomDecisionTree does not have no-arg Constructor. I have millions of training data so I can't train it every time I want to use it, What should I do?

    Thanks.

    opened by YossiShasha 9
  • 3 test erros.

    3 test erros.

    I had 3 test errors.

    OS: Win 10

    E:\data\finance\docs\ML\lib\JSAT-master\JSAT>java -version java version "1.7.0_79" Java(TM) SE Runtime Environment (build 1.7.0_79-b15) Java HotSpot(TM) 64-Bit Server VM (build 24.79-b02, mixed mode)

    E:\data\finance\docs\ML\lib\JSAT-master\JSAT>javac -version javac 1.7.0_79

    Results :

    Failed tests: LinearBatchTest.testTrainWarmCMultieFast:175 Warm start wasn't faster? 30 vs 28 FastMathTest.testPow:152 null NadarayaWatsonTest.testTrainC_RegressionDataSet_ExecutorService:103 null

    Tests run: 1049, Failures: 3, Errors: 0, Skipped: 0

    [INFO] ------------------------------------------------------------------------ [INFO] BUILD FAILURE [INFO] ------------------------------------------------------------------------ [INFO] Total time: 03:28 min [INFO] Finished at: 2016-01-04T16:59:37-05:00 [INFO] Final Memory: 9M/244M [INFO] ------------------------------------------------------------------------ [ERROR] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.18.1:test (default-test) on project JSAT: There are test failures. [ERROR] [ERROR] Please refer to E:\data\finance\docs\ML\lib\JSAT-master\JSAT\target\surefire-reports for the individual test results. [ERROR] -> [Help 1] org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.18.1:test (default-test) on project JSAT: There are test failures.

    Please refer to E:\data\finance\docs\ML\lib\JSAT-master\JSAT\target\surefire-reports for the individual test results. at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:212) at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153) at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145) at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:116) at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:80) at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:51) at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:128) at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:307) at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:193) at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:106) at org.apache.maven.cli.MavenCli.execute(MavenCli.java:862) at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:286) at org.apache.maven.cli.MavenCli.main(MavenCli.java:197) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:289) at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:229) at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:415) at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:356) Caused by: org.apache.maven.plugin.MojoFailureException: There are test failures.

    Please refer to E:\data\finance\docs\ML\lib\JSAT-master\JSAT\target\surefire-reports for the individual test results. at org.apache.maven.plugin.surefire.SurefireHelper.reportExecution(SurefireHelper.java:82) at org.apache.maven.plugin.surefire.SurefirePlugin.handleSummary(SurefirePlugin.java:254) at org.apache.maven.plugin.surefire.AbstractSurefireMojo.executeAfterPreconditionsChecked(AbstractSurefireMojo.java:854) at org.apache.maven.plugin.surefire.AbstractSurefireMojo.execute(AbstractSurefireMojo.java:722) at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:134) at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:208) ... 20 more

    opened by norvar 8
  • ArrayIndexOutOfBoundException after dimensional reduction

    ArrayIndexOutOfBoundException after dimensional reduction

    I tried to use PCA or MutualInfoFS to do dimensional reduction. After doing that I run the regression classifier, it crashes on the max dimension + 1.

    MutualInfoFS transform = new MutualInfoFS(dataSet, 200);
    dataSet.applyTransform(transform);
    classifier = new StochasticMultinomialLogisticRegression(learningRate, iterations);
    classifier.trainC(dataSet);
    

    And the error is

    Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 201 at jsat.linear.DenseVector.get(DenseVector.java:116) at jsat.linear.SparseVector.dot(SparseVector.java:511) at jsat.classifiers.linear.StochasticMultinomialLogisticRegression.classify(StochasticMultinomialLogisticRegression.java:539)

    Is that a bug? Or did I miss something?

    opened by DJBen 8
  • DataSet / DataPoint interface

    DataSet / DataPoint interface

    opened by erosval 7
  • Maven Repo

    Maven Repo

    Very nice, that you set up a maven repository. Maybe, for those who are not familiar with maven, you could upload the jar to the releases tab. Could you also add src and doc jars to your maven repo? (with maven-source-plugin and maven-javadoc-plugin). What about adding JSAT to the central maven repository?! Then anyone could find JSAT without changing the pom file

    opened by TKlerx 7
  • equals and hashCode for (almost all) Distributions

    equals and hashCode for (almost all) Distributions

    Added equals and hashCode methods for almost all distributions to be able to check whether two distributions are equal and to be able to use them in HashSets/Maps.

    opened by TKlerx 7
  • (mainly) Java/Javadoc warnings removed

    (mainly) Java/Javadoc warnings removed

    • fixed javadoc errors/warnings, compile warnings *html in javadoc
      • unused java imports
      • missing serialVersionUID
    • added SingleValueDistribution to DistributionSearch
    • Changed every "new ArrayList<Double/Integer>" to new DoubleList/IntList

    Sorry for this big pull request. Had to change something in almost every class.

    opened by TKlerx 7
  • OrdinaryKriging Infiniy

    OrdinaryKriging Infiniy

    In OrdinaryKriging.train(), when lup.det() is infinity that the LUPDecomposition will get a wrong X. However, I can get a right X when using singular value decomposition. So, I think it should be uesd SingularValueDecomposition instead of LUPDecomposition while lup.det() is infinity. Currently, just when lup.det() is NaN or very close to zero will use SingularValueDecomposition.

    opened by MichaelTenma 2
  • Increase the usage of compound assignment operators

    Increase the usage of compound assignment operators

    :eyes: Some source code analysis tools can help to find opportunities for improving software components. :thought_balloon: I propose to increase the usage of compound operators accordingly.

    Would you like to integrate anything from a transformation result which can be generated by a command like the following? (:point_right: Please check also for questionable change suggestions because of an evolving search pattern.)

    lokal$ perl -p -i.orig -0777 -e 's#\b(?<target>\S+)\s*=\s*\k<target>[ \t]*(?<operator>[+\-*/%^]|&(?!&)|\|(?!\|)|<<|>>>?)#$+{target} $+{operator}=#gm' $(find ~/Projekte/JSAT/lokal -name '*.java')
    
    opened by elfring 0
  • Using MeanShift with given bandwidth?

    Using MeanShift with given bandwidth?

    Maybe I'm missing something - but is it possible tu use MeanShift-Clustering with a given (fixed) bandwidth?

    As far as I follow the implementation, even if I provide the KDE with a set bandwidth to the MeanShift-Constructor, it gets overwritten in MeanShift's cluster-method by calling mkde.setUsingData(dataSet, parallel);:

    @Override
    public int[] cluster(DataSet dataSet, boolean parallel, int[] designations)
    {
        // ...
        
        final KernelFunction k = mkde.getKernelFunction();
        mkde.setUsingData(dataSet, parallel);
        mkde.scaleBandwidth(scaleBandwidthFactor);
            
        // ...
    }
    

    Scaling the bandwidth seems not sufficient for me, as the scaled bandwidth isn't fixed. But as this is done inside the cluster-step, there seems to be no way to intercept or re-set the bandwidth...

    A simple example how I've tried to use MeanShift:

    SimpleDataSet dataSet = ...
    double sigma = ...
    MetricKDE metricKDE = new MetricKDE(GaussKF.getInstance(), new EuclideanDistance());
    metricKDE.setBandwith(sigma); // <-- gets ignored!
    MeanShift meanShift = new MeanShift(metricKDE);
    List<List<DataPoint>> clusters = meanShift.cluster(dataSet); // <-- cluster trigger's bandwidth-estimation
    

    Actually, it's obvious, that the Kernel-Density-Estimation wants to estimate the bandwidth, but in my case, I need a consistent bandwidth for multiple runs and need 'only' the clustering-step for the data.

    Any help appreciated - thank you.

    opened by brainbytes42 0
  • Bump junit from 4.10 to 4.13.1 in /JSAT

    Bump junit from 4.10 to 4.13.1 in /JSAT

    Bumps junit from 4.10 to 4.13.1.

    Release notes

    Sourced from junit's releases.

    JUnit 4.13.1

    Please refer to the release notes for details.

    JUnit 4.13

    Please refer to the release notes for details.

    JUnit 4.13 RC 2

    Please refer to the release notes for details.

    JUnit 4.13 RC 1

    Please refer to the release notes for details.

    JUnit 4.13 Beta 3

    Please refer to the release notes for details.

    JUnit 4.13 Beta 2

    Please refer to the release notes for details.

    JUnit 4.13 Beta 1

    Please refer to the release notes for details.

    JUnit 4.12

    Please refer to the release notes for details.

    JUnit 4.12 Beta 3

    Please refer to the release notes for details.

    JUnit 4.12 Beta 2

    No release notes provided.

    JUnit 4.12 Beta 1

    No release notes provided.

    JUnit 4.11

    No release notes provided.

    Commits
    • 1b683f4 [maven-release-plugin] prepare release r4.13.1
    • ce6ce3a Draft 4.13.1 release notes
    • c29dd82 Change version to 4.13.1-SNAPSHOT
    • 1d17486 Add a link to assertThrows in exception testing
    • 543905d Use separate line for annotation in Javadoc
    • 510e906 Add sub headlines to class Javadoc
    • 610155b Merge pull request from GHSA-269g-pwp5-87pp
    • b6cfd1e Explicitly wrap float parameter for consistency (#1671)
    • a5d205c Fix GitHub link in FAQ (#1672)
    • 3a5c6b4 Deprecated since jdk9 replacing constructor instance of Double and Float (#1660)
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
  • How to create maven project for JSAT

    How to create maven project for JSAT

    How to create maven project for JSAT? Could you tell me anyone the command and argument to create maven project for JSAT? I tried to add dependencies into POM.xml file, whatever is given but it didn't work. Please help me

    Thanks and regards

    opened by ramjan-raeen 3
  • How to use for LVQ

    How to use for LVQ

    I want to use LVQ with this library, but I don't know how to use it. I have data to train like this:

    | Input | class target (prediction) | | ------ | ------ | | 1, 0, 0, 0, 1, 0 | 1 | | 0, 1, 1, 1, 1, 0 | 2 |

    and the data to be tested like this:

    | Input | class target (prediction) | | ------ | ------ | | 0, 1, 0, 0, 0, 1 | 1 | | 0, 0, 1, 1, 0, 0 | 2 |

    how to implement LVQ using this library? Thank you in advance.

    opened by garazpasir 1
Releases(0.0.9)
Owner
null
MALLET is a Java-based package for statistical natural language processing, document classification, clustering, topic modeling, information extraction, and other machine learning applications to text.

MALLET is a Java-based package for statistical natural language processing, document classification, clustering, topic modeling, information extraction, and other machine learning applications to text.

null 900 Jan 2, 2023
Statistical Machine Intelligence & Learning Engine

Smile Smile (Statistical Machine Intelligence and Learning Engine) is a fast and comprehensive machine learning, NLP, linear algebra, graph, interpola

Haifeng Li 5.7k Jan 1, 2023
Tribuo - A Java machine learning library

Tribuo - A Java prediction library (v4.2) Tribuo is a machine learning library in Java that provides multi-class classification, regression, clusterin

Oracle 1.1k Dec 28, 2022
Java time series machine learning tools in a Weka compatible toolkit

UEA Time Series Classification A Weka-compatible Java toolbox for time series classification, clustering and transformation. For the python sklearn-co

Machine Learning and Time Series Tools and Datasets 140 Nov 7, 2022
Oryx 2: Lambda architecture on Apache Spark, Apache Kafka for real-time large scale machine learning

Oryx 2 is a realization of the lambda architecture built on Apache Spark and Apache Kafka, but with specialization for real-time large scale machine l

Oryx Project 1.8k Dec 28, 2022
A machine learning package built for humans.

aerosolve Machine learning for humans. What is it? A machine learning library designed from the ground up to be human friendly. It is different from o

Airbnb 4.8k Dec 30, 2022
statistics, data mining and machine learning toolbox

Disambiguation (Italian dictionary) Field of turnips. It is also a place where there is confusion, where tricks and sims are plotted. (Computer scienc

Aurelian Tutuianu 63 Jun 11, 2022
Oryx 2: Lambda architecture on Apache Spark, Apache Kafka for real-time large scale machine learning

Oryx 2 is a realization of the lambda architecture built on Apache Spark and Apache Kafka, but with specialization for real-time large scale machine l

Oryx Project 1.7k Mar 12, 2021
An Engine-Agnostic Deep Learning Framework in Java

Deep Java Library (DJL) Overview Deep Java Library (DJL) is an open-source, high-level, engine-agnostic Java framework for deep learning. DJL is desig

Amazon Web Services - Labs 2.9k Jan 7, 2023
java deep learning algorithms and deep neural networks with gpu acceleration

Deep Neural Networks with GPU support Update This is a newer version of the framework, that I developed while working at ExB Research. Currently, you

Ivan Vasilev 1.2k Jan 6, 2023
Learning Based Java (LBJava)

Learning Based Java LBJava core LBJava examples LBJava maven plugin Compiling the whole package From the root directory run the following command: Jus

CogComp 12 Jun 9, 2019
Simple ATM Machine made with Java

Output / Preview Enter your account number: Enter your pin number: ATM main menu: 1. - View Account Balance 2. - Withdraw funds 3. - Add funds 4. - T

SonLyte 10 Oct 21, 2021
An Engine-Agnostic Deep Learning Framework in Java

Deep Java Library (DJL) Overview Deep Java Library (DJL) is an open-source, high-level, engine-agnostic Java framework for deep learning. DJL is desig

DeepJavaLibrary 2.9k Jan 7, 2023
On-device wake word detection powered by deep learning.

Porcupine Made in Vancouver, Canada by Picovoice Porcupine is a highly-accurate and lightweight wake word engine. It enables building always-listening

Picovoice 2.8k Dec 30, 2022
Test project for learning GoF design pattern

DesignPattern Test project for learning GoF design pattern ㅁ개요 객체지향 설계의 교과서라고 불리는 Design Pattern 을 직접 Activity 별로 구현해봤습니다. ㅁ동기 물론 디자인패턴을 몰라도 기능은 얼마든지

null 11 Aug 8, 2022
Abstract machine for formal semantics of SIMP (Simple Imperative Language)

SIMP-abstract-machine In 2020/21 I was a Teaching Assistant for the second year module 5CCS2PLD Programming Language Paradigms at King's College Londo

Sten Arthur Laane 25 Oct 10, 2022