Skip to content

Commit

Permalink
float64 related entities generation fixed
Browse files Browse the repository at this point in the history
  • Loading branch information
gyrdym committed Nov 14, 2019
1 parent 94da0ae commit eadb42f
Show file tree
Hide file tree
Showing 9 changed files with 53 additions and 61 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import 'package:ml_linalg/src/matrix/data_manager/matrix_data_manager.dart';
import 'package:ml_linalg/src/matrix/helper/get_2d_iterable_length.dart';
import 'package:ml_linalg/src/matrix/helper/get_length_of_first_or_zero.dart';
import 'package:ml_linalg/src/matrix/helper/get_zero_based_indices.dart';
import 'package:ml_linalg/src/matrix/iterator/float64_matrix_iterator.gen.dart';
import 'package:ml_linalg/src/matrix/iterator/float64_matrix_iterator.dart';
import 'package:ml_linalg/vector.dart';

const _bytesPerElement = Float64List.bytesPerElement;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -379,14 +379,21 @@ class Float64x2Vector with IterableMixin<double> implements Vector {
? _simdHelper.simdValueToList(_innerSimdList[_numOfBuckets - 1])
: <double>[];

final lastFullBucketIdx = _isLastBucketNotFull
final _fullBucketsNumber = _isLastBucketNotFull
? _numOfBuckets - 1
: _numOfBuckets;

int counter = 0;

_innerSimdList.forEach((element) => iteratorFn(
element as T, counter++ == lastFullBucketIdx, remains));
_innerSimdList
.take(_fullBucketsNumber)
.forEach(
(element) => iteratorFn(
element as T,
++counter == _fullBucketsNumber,
remains,
),
);
}

@override
Expand Down
2 changes: 1 addition & 1 deletion lib/vector.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import 'package:ml_linalg/norm.dart';
import 'package:ml_linalg/src/common/cache_manager/cache_manager_factory.dart';
import 'package:ml_linalg/src/di/dependencies.dart';
import 'package:ml_linalg/src/vector/float32x4_vector.dart';
import 'package:ml_linalg/src/vector/float64x2_vector.gen.dart';
import 'package:ml_linalg/src/vector/float64x2_vector.dart';
import 'package:ml_linalg/src/vector/simd_helper/simd_helper_factory.dart';

final _cacheManagerFactory = dependencies.getDependency<CacheManagerFactory>();
Expand Down
9 changes: 9 additions & 0 deletions tool/generate.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import 'generate_float64_matrix_data_manager.dart';
import 'generate_float64_matrix_iterator.dart';
import 'generate_float64x2_vector.dart';

void main() {
generateFloat64x2Vector();
generateFloat64MatrixIterator();
generateFloat64MatrixDataManager();
}
24 changes: 17 additions & 7 deletions tool/generate_class_from_template.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,25 +3,35 @@ import 'dart:io';

import 'package:path/path.dart' as p;

final _defaultMapping = {
RegExp('(F|f)loat32x4'): (Match match) => '${match.group(1)}loat64x2',
RegExp('(F|f)loat32'): (Match match) => '${match.group(1)}loat64',
};

Future<Null> generateClassFromTemplate(
String targetFileName,
String templateFileName,
Map<String, String> mapping,
[
{
Map<Pattern, String Function(Match)> mapping,
String comment = '/* This file is auto generated, do not change it manually */\n\n',
]
}
) async {
final File libraryFile = File(targetFileName);

if (libraryFile.existsSync()) {
await libraryFile.delete();
}

await _processFile(targetFileName, templateFileName, mapping, comment);
await _processFile(
targetFileName,
templateFileName,
{}..addAll(mapping ?? {})..addAll(_defaultMapping),
comment,
);
}

Future<Null> _processFile(String targetFileName, String inputFileName,
Map<String, String> mapping, String comment) async {
Map<Pattern, String Function(Match)> mapping, String comment) async {
final File inputFile = File(inputFileName);

final String input = await inputFile.readAsString();
Expand All @@ -39,6 +49,6 @@ Future<Null> _processFile(String targetFileName, String inputFileName,
}

String _convertTemplateToTargetClass(String input,
Map<String, String> mapping) =>
Map<Pattern, String Function(Match)> mapping) =>
mapping.entries.fold(input, (processedInput, entry) =>
processedInput.replaceAll(entry.key, entry.value));
processedInput.replaceAllMapped(entry.key, entry.value));
12 changes: 5 additions & 7 deletions tool/generate_float64_matrix_data_manager.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,11 @@ import 'dart:async';

import 'generate_class_from_template.dart';

const _templateFileName = 'lib/src/matrix/data_manager/float32_matrix_data_manager.dart';
const _targetFileName = 'lib/src/matrix/data_manager/float64_matrix_data_manager.gen.dart';
Future<Null> generateFloat64MatrixDataManager() => generateClassFromTemplate(
'lib/src/matrix/data_manager/float64_matrix_data_manager.dart',
'lib/src/matrix/data_manager/float32_matrix_data_manager.dart',
);

Future<Null> main() async {
await generateClassFromTemplate(_targetFileName, _templateFileName, {
'Float32': 'Float64',
'float32_matrix_iterator': 'float64_matrix_iterator.gen',
'DType.float32': 'DType.float64',
});
await generateFloat64MatrixDataManager();
}
10 changes: 5 additions & 5 deletions tool/generate_float64_matrix_iterator.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@ import 'dart:async';

import 'generate_class_from_template.dart';

const _templateFileName = 'lib/src/matrix/iterator/float32_matrix_iterator.dart';
const _targetFileName = 'lib/src/matrix/iterator/float64_matrix_iterator.gen.dart';
Future<Null> generateFloat64MatrixIterator() => generateClassFromTemplate(
'lib/src/matrix/iterator/float64_matrix_iterator.dart',
'lib/src/matrix/iterator/float32_matrix_iterator.dart',
);

Future<Null> main() async {
await generateClassFromTemplate(_targetFileName, _templateFileName, {
'Float32': 'Float64',
});
await generateFloat64MatrixIterator();
}
42 changes: 5 additions & 37 deletions tool/generate_float64x2_vector.dart
Original file line number Diff line number Diff line change
@@ -1,44 +1,12 @@
import 'dart:async';
import 'dart:io';

import 'package:path/path.dart' as p;
import 'generate_class_from_template.dart';

const _templateFileName = 'lib/src/vector/float32x4_vector.dart';
const _targetFileName = 'lib/src/vector/float64x2_vector.gen.dart';
const _warningTextComment = '/* This file is auto generated, do not change it manually */\n\n';
Future<Null> generateFloat64x2Vector() => generateClassFromTemplate(
'lib/src/vector/float64x2_vector.dart',
'lib/src/vector/float32x4_vector.dart',
);

Future<Null> main() async {
await generateFloat64x2Vector();
}

Future<Null> generateFloat64x2Vector() async {
final File libraryFile = File(_targetFileName);

if (libraryFile.existsSync()) {
await libraryFile.delete();
}

await _processFile(_templateFileName);
}

Future<Null> _processFile(String inputFileName) async {
final File inputFile = File(inputFileName);

final String input = await inputFile.readAsString();
final String output = '$_warningTextComment${_convertToFloat64x2Vector(input)}';

final String outputFileName = _targetFileName;
final Directory dir = Directory(p.dirname(outputFileName));

await dir.create(recursive: true);

final File outputFile = File(outputFileName);
await outputFile.writeAsString(output);
}

String _convertToFloat64x2Vector(String input) => input
.replaceAll('Float32x4List', 'Float64x2List')
.replaceAll('Float32x4', 'Float64x2')
.replaceAll('Float32List', 'Float64List')
.replaceAll('DType.float32', 'DType.float64')
.replaceAll('setFloat32', 'setFloat64');

0 comments on commit eadb42f

Please sign in to comment.