Skip to content

Commit

Permalink
Set up github actions
Browse files Browse the repository at this point in the history
  • Loading branch information
gyrdym committed Dec 12, 2020
1 parent 318fe3a commit 16adc96
Show file tree
Hide file tree
Showing 33 changed files with 126 additions and 85 deletions.
40 changes: 40 additions & 0 deletions .github/workflows/dart.yml
@@ -0,0 +1,40 @@
name: Dart

on:
push:
branches: [ master ]
pull_request:
branches: [ master ]

jobs:
build:
runs-on: ubuntu-latest

container:
image: google/dart:latest

steps:
- uses: actions/checkout@v2

- name: Print Dart SDK version
run: dart --version

- name: Install dependencies
run: dart pub get

- name: Analyze project source
run: dart analyze --fatal-infos

- name: Run tests
run: dart test

- name: Run e2e tests
run: dart pub run test e2e -p vm

- name: Code coverage
run: dart pub run test_coverage

- name: Coveralls GitHub Action
uses: coverallsapp/github-action@v1.1.2
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
5 changes: 0 additions & 5 deletions .travis.yml

This file was deleted.

3 changes: 3 additions & 0 deletions CHANGELOG.md
@@ -1,5 +1,8 @@
# Changelog

## 15.3.5
- Github actions set up

## 15.3.4
- `DI logic`:
- conditional dependency registering added
Expand Down
2 changes: 1 addition & 1 deletion analysis_options.yaml
@@ -1 +1 @@
include: package:ml_tech/analysis_options.yaml
include: package:pedantic/analysis_options.yaml
2 changes: 1 addition & 1 deletion benchmark/logistic_regressor.dart
Expand Up @@ -28,7 +28,7 @@ class LogisticRegressorBenchmark extends BenchmarkBase {

@override
void setup() {
final Matrix observations = Matrix.fromRows(List.generate(observationsNum,
final observations = Matrix.fromRows(List.generate(observationsNum,
(i) => Vector.randomFilled(columnsNum)));

_data = DataFrame.fromMatrix(observations);
Expand Down
3 changes: 3 additions & 0 deletions e2e_tests.sh
@@ -0,0 +1,3 @@
#!/bin/bash

pub run test e2e -p vm

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Expand Up @@ -51,6 +51,7 @@ class SoftmaxRegressorImpl
factory SoftmaxRegressorImpl.fromJson(Map<String, dynamic> json) =>
_$SoftmaxRegressorImplFromJson(json);

@override
Map<String, dynamic> toJson() => _$SoftmaxRegressorImplToJson(this);

@override
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 3 additions & 2 deletions pubspec.yaml
@@ -1,6 +1,6 @@
name: ml_algo
description: Machine learning algorithms, Machine learning models performance evaluation functionality
version: 15.3.4
version: 15.3.5
homepage: https://github.com/gyrdym/ml_algo

environment:
Expand All @@ -21,7 +21,8 @@ dev_dependencies:
build_runner: ^1.1.2
build_test: ^0.10.2
grinder: ^0.8.3
ml_tech: ^0.0.8
mockito: ^3.0.0
pedantic: ^1.9.2
process_run: ^0.10.12
test: ^1.2.0
test_coverage: ^0.5.0
Expand Up @@ -16,10 +16,10 @@ import 'package:ml_linalg/dtype.dart';
import 'package:ml_linalg/dtype_to_json.dart';
import 'package:ml_linalg/matrix.dart';
import 'package:ml_linalg/vector.dart';
import 'package:ml_tech/unit_testing/matchers/iterable_2d_almost_equal_to.dart';
import 'package:mockito/mockito.dart';
import 'package:test/test.dart';

import '../../helpers.dart';
import '../../mocks.dart';

void main() {
Expand Down
3 changes: 1 addition & 2 deletions test/classifier/knn_classifier/knn_classifier_impl_test.dart
Expand Up @@ -2,13 +2,12 @@ import 'package:ml_algo/src/classifier/knn_classifier/_injector.dart';
import 'package:ml_algo/src/classifier/knn_classifier/knn_classifier_impl.dart';
import 'package:ml_algo/src/di/injector.dart';
import 'package:ml_algo/src/knn_solver/neigbour.dart';
import 'package:ml_algo/src/metric/metric_type.dart';
import 'package:ml_dataframe/ml_dataframe.dart';
import 'package:ml_linalg/linalg.dart';
import 'package:ml_tech/unit_testing/matchers/iterable_2d_almost_equal_to.dart';
import 'package:mockito/mockito.dart';
import 'package:test/test.dart';

import '../../helpers.dart';
import '../../mocks.dart';

void main() {
Expand Down
Expand Up @@ -5,9 +5,10 @@ import 'package:ml_algo/src/linear_optimizer/gradient_optimizer/learning_rate_ge
import 'package:ml_dataframe/ml_dataframe.dart';
import 'package:ml_linalg/dtype.dart';
import 'package:ml_linalg/linalg.dart';
import 'package:ml_tech/unit_testing/matchers/iterable_2d_almost_equal_to.dart';
import 'package:test/test.dart';

import '../../../helpers.dart';

void main() {
group('LogisticRegressor', () {
final createClassifier = ({
Expand Down
Expand Up @@ -3,7 +3,6 @@ import 'package:ml_algo/src/classifier/logistic_regressor/logistic_regressor_imp
import 'package:ml_algo/src/common/exception/invalid_class_labels_exception.dart';
import 'package:ml_algo/src/common/exception/invalid_probability_threshold_exception.dart';
import 'package:ml_algo/src/di/injector.dart';
import 'package:ml_algo/src/metric/metric_type.dart';
import 'package:ml_dataframe/ml_dataframe.dart';
import 'package:ml_linalg/linalg.dart';
import 'package:mockito/mockito.dart';
Expand Down
Expand Up @@ -18,10 +18,10 @@ import 'package:ml_dataframe/ml_dataframe.dart';
import 'package:ml_linalg/dtype.dart';
import 'package:ml_linalg/matrix.dart';
import 'package:ml_linalg/vector.dart';
import 'package:ml_tech/unit_testing/matchers/iterable_2d_almost_equal_to.dart';
import 'package:mockito/mockito.dart';
import 'package:test/test.dart';

import '../../../helpers.dart';
import '../../../mocks.dart';

void main() {
Expand Down
@@ -1,7 +1,6 @@
import 'dart:io';

import 'package:ml_algo/ml_algo.dart';
import 'package:ml_algo/src/classifier/softmax_regressor/_init_module.dart';
import 'package:ml_algo/src/classifier/softmax_regressor/_injector.dart';
import 'package:ml_algo/src/classifier/softmax_regressor/softmax_regressor_json_keys.dart';
import 'package:ml_algo/src/di/injector.dart';
Expand Down
@@ -1,15 +1,14 @@
import 'package:ml_algo/src/classifier/softmax_regressor/_injector.dart';
import 'package:ml_algo/src/classifier/softmax_regressor/softmax_regressor_impl.dart';
import 'package:ml_algo/src/di/injector.dart';
import 'package:ml_algo/src/metric/metric_type.dart';
import 'package:ml_dataframe/ml_dataframe.dart';
import 'package:ml_linalg/dtype.dart';
import 'package:ml_linalg/matrix.dart';
import 'package:ml_linalg/vector.dart';
import 'package:ml_tech/unit_testing/matchers/iterable_2d_almost_equal_to.dart';
import 'package:mockito/mockito.dart';
import 'package:test/test.dart';

import '../../../helpers.dart';
import '../../../mocks.dart';

void main() {
Expand Down
@@ -1,4 +1,3 @@
import 'package:injector/injector.dart';
import 'package:ml_algo/ml_algo.dart';
import 'package:ml_algo/src/classifier/softmax_regressor/_helpers/create_softmax_regressor.dart';
import 'package:ml_algo/src/classifier/softmax_regressor/_injector.dart';
Expand All @@ -19,10 +18,10 @@ import 'package:ml_dataframe/ml_dataframe.dart';
import 'package:ml_linalg/dtype.dart';
import 'package:ml_linalg/linalg.dart';
import 'package:ml_linalg/matrix.dart';
import 'package:ml_tech/unit_testing/matchers/iterable_2d_almost_equal_to.dart';
import 'package:mockito/mockito.dart';
import 'package:test/test.dart';

import '../../../helpers.dart';
import '../../../mocks.dart';

void main() {
Expand Down
3 changes: 2 additions & 1 deletion test/cost_function/least_square_cost_function_test.dart
Expand Up @@ -2,9 +2,10 @@ import 'dart:math' as math;

import 'package:ml_algo/src/cost_function/least_square_cost_function.dart';
import 'package:ml_linalg/linalg.dart';
import 'package:ml_tech/unit_testing/matchers/iterable_2d_almost_equal_to.dart';
import 'package:test/test.dart';

import '../helpers.dart';

void main() {
group('LeastSquareCostFunction', () {
final x11 = 21.5;
Expand Down
34 changes: 34 additions & 0 deletions test/helpers.dart
@@ -0,0 +1,34 @@
import 'dart:convert' as convert;
import 'dart:io';

import 'package:test/test.dart';

Matcher iterable2dAlmostEqualTo(Iterable<Iterable<double>> expected,
[double precision = 1e-5]) =>
pairwiseCompare<Iterable<double>, Iterable<double>>(expected,
(Iterable<double> expected, Iterable<double> actual) {
if (expected.length != actual.length) {
return false;
}
for (var i = 0; i < expected.length; i++) {
if ((expected.elementAt(i) - actual.elementAt(i)).abs() >= precision) {
return false;
}
}
return true;
}, '');

Matcher iterableAlmostEqualTo(Iterable<double> expected,
[double precision = 1e-5]) =>
pairwiseCompare<double, double>(
expected,
(expectedVal, actualVal) =>
(expectedVal - actualVal).abs() <= precision,
'');

Future<Map<String, dynamic>> readJSON(String fileName) async =>
await File(fileName)
.openRead()
.transform(convert.utf8.decoder)
.transform(convert.json.decoder)
.first as Map<String, dynamic>;
Expand Up @@ -4,9 +4,10 @@ import 'package:ml_algo/src/di/injector.dart';
import 'package:ml_algo/src/linear_optimizer/coordinate_optimizer/coordinate_descent_optimizer.dart';
import 'package:ml_algo/src/linear_optimizer/initial_coefficients_generator/initial_coefficients_type.dart';
import 'package:ml_linalg/linalg.dart';
import 'package:ml_tech/unit_testing/matchers/iterable_almost_equal_to.dart';
import 'package:test/test.dart';

import '../../helpers.dart';

/// L1 regularization, as known as Lasso, is aimed to penalize unimportant features, setting their weights to the zero,
/// therefore, we can treat the objective of the Lasso Optimizer like feature selection. Since lasso solver regularizes
/// coefficients by adding to their magnitude their L1-norm, we cannot use gradient methods any longer. Instead, we can
Expand Down
Expand Up @@ -4,9 +4,10 @@ import 'package:ml_algo/src/link_function/logit/float32_inverse_logit_function.d
import 'package:ml_algo/src/link_function/logit/float64_inverse_logit_function.dart';
import 'package:ml_linalg/dtype.dart';
import 'package:ml_linalg/matrix.dart';
import 'package:ml_tech/unit_testing/matchers/iterable_2d_almost_equal_to.dart';
import 'package:test/test.dart';

import '../../helpers.dart';

void main() {
void testInverseLogitLinkFunction(LinkFunction inverseLogitLink, DType dtype) {
group(inverseLogitLink.runtimeType, () {
Expand Down Expand Up @@ -36,7 +37,6 @@ void main() {
[-4.0],
], dtype: dtype);
final probabilities = inverseLogitLink.link(scores);
final a = 2.3;

expect(probabilities, iterable2dAlmostEqualTo([
[0.268],
Expand Down
3 changes: 2 additions & 1 deletion test/link_function/softmax/softmax_link_function_test.dart
Expand Up @@ -3,9 +3,10 @@ import 'package:ml_algo/src/link_function/softmax/float32_softmax_link_function.
import 'package:ml_algo/src/link_function/softmax/float64_softmax_link_function.dart';
import 'package:ml_linalg/dtype.dart';
import 'package:ml_linalg/matrix.dart';
import 'package:ml_tech/unit_testing/matchers/iterable_2d_almost_equal_to.dart';
import 'package:test/test.dart';

import '../../helpers.dart';

void main() {
void testSoftmaxLinkFunction(LinkFunction linkFunction, DType dtype) {
group(linkFunction.runtimeType, () {
Expand Down
10 changes: 5 additions & 5 deletions test/math/randomizer_test.dart
Expand Up @@ -8,7 +8,7 @@ import 'package:test/test.dart';
class RandomMock extends Mock implements Random {}

void main() {
const int maxEpoch = 400;
const maxEpoch = 400;

Random baseGenerator;
Randomizer randomizer;
Expand Down Expand Up @@ -100,7 +100,7 @@ void main() {
final start = 2;
final end = 13;

for (int i = 0; i < maxEpoch; i++) {
for (var i = 0; i < maxEpoch; i++) {
final value = randomizer.getIntegerFromInterval(start, end);
expect(start <= value && value < end, isTrue);
}
Expand All @@ -112,7 +112,7 @@ void main() {
final start = 6;
final end = 17;

for (int i = 0; i < maxEpoch; i++) {
for (var i = 0; i < maxEpoch; i++) {
final interval = randomizer.getIntegerInterval(start, end,
intervalLength: intervalLength);

Expand All @@ -135,7 +135,7 @@ void main() {
final start = 0;
final end = 1;

for (int i = 0; i < maxEpoch; i++) {
for (var i = 0; i < maxEpoch; i++) {
final value = randomizer.getIntegerFromInterval(start, end);
expect(value, isZero);
}
Expand All @@ -155,7 +155,7 @@ void main() {
final start = 5.3;
final end = 123.4;

for (int i = 0; i < maxEpoch; i++) {
for (var i = 0; i < maxEpoch; i++) {
final value = randomizer.getDoubleFromInterval(start, end);
expect(start <= value && value < end, isTrue);
}
Expand Down
1 change: 0 additions & 1 deletion test/metric/classification/recall_test.dart
@@ -1,4 +1,3 @@
import 'package:ml_algo/src/metric/classification/precision.dart';
import 'package:ml_algo/src/metric/classification/recall.dart';
import 'package:ml_linalg/matrix.dart';
import 'package:test/test.dart';
Expand Down

0 comments on commit 16adc96

Please sign in to comment.