U3JHTSEMJLXNKOMAQJQPZKRW6GRPHYLG6DK53XVADIETKVCS2MFQC import 'package:flutter_test/flutter_test.dart';import 'package:dartmcts/dartmcts.dart';void main() {test('adds one to input values', () {final calculator = Calculator();expect(calculator.addOne(2), 3);expect(calculator.addOne(-7), -6);expect(calculator.addOne(0), 1);expect(() => calculator.addOne(null), throwsNoSuchMethodError);});}
name: dartmctsdescription: A new Flutter package project.version: 0.0.1author:homepage:environment:sdk: ">=2.7.0 <3.0.0"dependencies:flutter:sdk: flutterdev_dependencies:flutter_test:sdk: flutterdataclass_generator: ^0.3.0+2build_runner: ^1.7.0# For information on the generic Dart part of this file, see the# following page: https://dart.dev/tools/pub/pubspec# The following section is specific to Flutter.flutter:# To add assets to your package, add an assets section, like this:# assets:# - images/a_dot_burr.jpeg# - images/a_dot_ham.jpeg## For details regarding assets in packages, see# https://flutter.dev/assets-and-images/#from-packages## An image asset can refer to one or more resolution-specific "variants", see# https://flutter.dev/assets-and-images/#resolution-aware.# To add custom fonts to your package, add a fonts section here,# in this "flutter" section. Each entry in this list should have a# "family" key with the font family name, and a "fonts" key with a# list giving the asset and other descriptors for the font. For# example:# fonts:# - family: Schyler# fonts:# - asset: fonts/Schyler-Regular.ttf# - asset: fonts/Schyler-Italic.ttf# style: italic# - family: Trajan Pro# fonts:# - asset: fonts/TrajanPro.ttf# - asset: fonts/TrajanPro_Bold.ttf# weight: 700## For details regarding fonts in packages, see# https://flutter.dev/custom-fonts/#from-packages
# Generated by pub# See https://dart.dev/tools/pub/glossary#lockfilepackages:_fe_analyzer_shared:dependency: transitivedescription:name: _fe_analyzer_sharedurl: "https://pub.dartlang.org"source: hostedversion: "4.0.0"analyzer:dependency: transitivedescription:name: analyzerurl: "https://pub.dartlang.org"source: hostedversion: "0.39.10"archive:dependency: transitivedescription:name: archiveurl: "https://pub.dartlang.org"source: hostedversion: "2.0.13"args:dependency: transitivedescription:name: argsurl: "https://pub.dartlang.org"source: hostedversion: "1.6.0"async:dependency: transitivedescription:name: asyncurl: "https://pub.dartlang.org"source: hostedversion: "2.4.1"boolean_selector:dependency: transitivedescription:name: boolean_selectorurl: "https://pub.dartlang.org"source: hostedversion: "2.0.0"build:dependency: transitivedescription:name: buildurl: "https://pub.dartlang.org"source: hostedversion: "1.2.2"build_config:dependency: transitivedescription:name: build_configurl: "https://pub.dartlang.org"source: hostedversion: "0.4.2"build_daemon:dependency: transitivedescription:name: build_daemonurl: "https://pub.dartlang.org"source: hostedversion: "2.1.4"build_resolvers:dependency: transitivedescription:name: build_resolversurl: "https://pub.dartlang.org"source: hostedversion: "1.3.7"build_runner:dependency: "direct dev"description:name: build_runnerurl: "https://pub.dartlang.org"source: hostedversion: "1.9.0"build_runner_core:dependency: transitivedescription:name: build_runner_coreurl: "https://pub.dartlang.org"source: hostedversion: "5.1.0"built_collection:dependency: transitivedescription:name: built_collectionurl: "https://pub.dartlang.org"source: hostedversion: "4.3.2"built_value:dependency: transitivedescription:name: built_valueurl: "https://pub.dartlang.org"source: hostedversion: "7.1.0"charcode:dependency: transitivedescription:name: charcodeurl: "https://pub.dartlang.org"source: hostedversion: "1.1.3"checked_yaml:dependency: transitivedescription:name: checked_yamlurl: "https://pub.dartlang.org"source: hostedversion: "1.0.2"code_builder:dependency: transitivedescription:name: code_builderurl: "https://pub.dartlang.org"source: hostedversion: "3.2.1"collection:dependency: transitivedescription:name: collectionurl: "https://pub.dartlang.org"source: hostedversion: "1.14.12"convert:dependency: transitivedescription:name: converturl: "https://pub.dartlang.org"source: hostedversion: "2.1.1"crypto:dependency: transitivedescription:name: cryptourl: "https://pub.dartlang.org"source: hostedversion: "2.1.4"csslib:dependency: transitivedescription:name: cssliburl: "https://pub.dartlang.org"source: hostedversion: "0.16.1"dart_style:dependency: transitivedescription:name: dart_styleurl: "https://pub.dartlang.org"source: hostedversion: "1.3.6"dataclass:dependency: transitivedescription:name: dataclassurl: "https://pub.dartlang.org"source: hostedversion: "0.3.0+1"dataclass_generator:dependency: "direct dev"description:name: dataclass_generatorurl: "https://pub.dartlang.org"source: hostedversion: "0.3.0+2"fixnum:dependency: transitivedescription:name: fixnumurl: "https://pub.dartlang.org"source: hostedversion: "0.10.11"flutter:dependency: "direct main"description: fluttersource: sdkversion: "0.0.0"flutter_test:dependency: "direct dev"description: fluttersource: sdkversion: "0.0.0"glob:dependency: transitivedescription:name: globurl: "https://pub.dartlang.org"source: hostedversion: "1.2.0"graphs:dependency: transitivedescription:name: graphsurl: "https://pub.dartlang.org"source: hostedversion: "0.2.0"html:dependency: transitivedescription:name: htmlurl: "https://pub.dartlang.org"source: hostedversion: "0.14.0+3"http_multi_server:dependency: transitivedescription:name: http_multi_serverurl: "https://pub.dartlang.org"source: hostedversion: "2.2.0"http_parser:dependency: transitivedescription:name: http_parserurl: "https://pub.dartlang.org"source: hostedversion: "3.1.4"image:dependency: transitivedescription:name: imageurl: "https://pub.dartlang.org"source: hostedversion: "2.1.12"io:dependency: transitivedescription:name: iourl: "https://pub.dartlang.org"source: hostedversion: "0.3.4"js:dependency: transitivedescription:name: jsurl: "https://pub.dartlang.org"source: hostedversion: "0.6.2"json_annotation:dependency: transitivedescription:name: json_annotationurl: "https://pub.dartlang.org"source: hostedversion: "3.0.1"logging:dependency: transitivedescription:name: loggingurl: "https://pub.dartlang.org"source: hostedversion: "0.11.4"matcher:dependency: transitivedescription:name: matcherurl: "https://pub.dartlang.org"source: hostedversion: "0.12.6"meta:dependency: transitivedescription:name: metaurl: "https://pub.dartlang.org"source: hostedversion: "1.1.8"mime:dependency: transitivedescription:name: mimeurl: "https://pub.dartlang.org"source: hostedversion: "0.9.6+3"node_interop:dependency: transitivedescription:name: node_interopurl: "https://pub.dartlang.org"source: hostedversion: "1.1.1"node_io:dependency: transitivedescription:name: node_iourl: "https://pub.dartlang.org"source: hostedversion: "1.1.1"package_config:dependency: transitivedescription:name: package_configurl: "https://pub.dartlang.org"source: hostedversion: "1.9.3"path:dependency: transitivedescription:name: pathurl: "https://pub.dartlang.org"source: hostedversion: "1.6.4"pedantic:dependency: transitivedescription:name: pedanticurl: "https://pub.dartlang.org"source: hostedversion: "1.9.0"petitparser:dependency: transitivedescription:name: petitparserurl: "https://pub.dartlang.org"source: hostedversion: "2.4.0"pool:dependency: transitivedescription:name: poolurl: "https://pub.dartlang.org"source: hostedversion: "1.4.0"pub_semver:dependency: transitivedescription:name: pub_semverurl: "https://pub.dartlang.org"source: hostedversion: "1.4.4"pubspec_parse:dependency: transitivedescription:name: pubspec_parseurl: "https://pub.dartlang.org"source: hostedversion: "0.1.5"quiver:dependency: transitivedescription:name: quiverurl: "https://pub.dartlang.org"source: hostedversion: "2.1.3"shelf:dependency: transitivedescription:name: shelfurl: "https://pub.dartlang.org"source: hostedversion: "0.7.5"shelf_web_socket:dependency: transitivedescription:name: shelf_web_socketurl: "https://pub.dartlang.org"source: hostedversion: "0.2.3"sky_engine:dependency: transitivedescription: fluttersource: sdkversion: "0.0.99"source_gen:dependency: transitivedescription:name: source_genurl: "https://pub.dartlang.org"source: hostedversion: "0.9.5"source_span:dependency: transitivedescription:name: source_spanurl: "https://pub.dartlang.org"source: hostedversion: "1.7.0"stack_trace:dependency: transitivedescription:name: stack_traceurl: "https://pub.dartlang.org"source: hostedversion: "1.9.3"stream_channel:dependency: transitivedescription:name: stream_channelurl: "https://pub.dartlang.org"source: hostedversion: "2.0.0"stream_transform:dependency: transitivedescription:name: stream_transformurl: "https://pub.dartlang.org"source: hostedversion: "1.2.0"string_scanner:dependency: transitivedescription:name: string_scannerurl: "https://pub.dartlang.org"source: hostedversion: "1.0.5"term_glyph:dependency: transitivedescription:name: term_glyphurl: "https://pub.dartlang.org"source: hostedversion: "1.1.0"test_api:dependency: transitivedescription:name: test_apiurl: "https://pub.dartlang.org"source: hostedversion: "0.2.15"timing:dependency: transitivedescription:name: timingurl: "https://pub.dartlang.org"source: hostedversion: "0.1.1+2"typed_data:dependency: transitivedescription:name: typed_dataurl: "https://pub.dartlang.org"source: hostedversion: "1.1.6"vector_math:dependency: transitivedescription:name: vector_mathurl: "https://pub.dartlang.org"source: hostedversion: "2.0.8"watcher:dependency: transitivedescription:name: watcherurl: "https://pub.dartlang.org"source: hostedversion: "0.9.7+15"web_socket_channel:dependency: transitivedescription:name: web_socket_channelurl: "https://pub.dartlang.org"source: hostedversion: "1.1.0"xml:dependency: transitivedescription:name: xmlurl: "https://pub.dartlang.org"source: hostedversion: "3.6.1"yaml:dependency: transitivedescription:name: yamlurl: "https://pub.dartlang.org"source: hostedversion: "2.2.1"sdks:dart: ">=2.7.0 <3.0.0"
library dartmcts;import 'dart:math';var random = Random();class InvalidMove implements Exception {}abstract class GameState<MoveType, PlayerType> {GameState<MoveType, PlayerType> cloneAndApplyMove(MoveType move);List<MoveType> getMoves();GameState<MoveType, PlayerType> determine(GameState<MoveType, PlayerType> initialState);PlayerType winner;PlayerType currentPlayer;}class Node<MoveType, PlayerType> {GameState<MoveType, PlayerType> gameState;final Node<MoveType, PlayerType> parent;final MoveType move;int visits;final int depth;final Map<PlayerType, int> winsByPlayer;int draws;final GameState initialState;bool needStateReset = false;double c = 1.41421356237;Map<MoveType, Node<MoveType, PlayerType>> _children = {};Node({this.gameState,this.parent,this.move,this.visits = 0,this.depth,this.winsByPlayer,this.draws,this.c}): initialState = gameState;determine() {gameState = gameState.determine(initialState);}resetState() {needStateReset = true;}addNewChildrenForDetermination(List<MoveType> moves) {for (var move in moves) {if (_children.containsKey(move)) {continue;}_children[move] = Node(gameState: gameState,move: move,parent: this,c: c,depth: depth + 1);}}Map<MoveType, Node<MoveType, PlayerType>> get children {// This GameState might not be selected during a simulation so we only generate// the children when necessaryif (_children.isEmpty || needStateReset) {if (move != null) {gameState = initialState.cloneAndApplyMove(move);}}var moves = gameState.getMoves();addNewChildrenForDetermination(moves);return Map.fromEntries(_children.entries.where((x) => x.key == move));}double ucb1(PlayerType player) {if (parent == null || visits == 0) {return 0.0;}return (((winsByPlayer[player] ?? 0) + (draws * 0.5)) / visits) +(c * sqrt(log(parent.visits.toDouble() / visits)));}PlayerType getWinner() {return gameState.winner;}PlayerType currentPlayer() {return gameState.currentPlayer;}Node<MoveType, PlayerType> getBestChild() {if (children.isEmpty) {return null;}var sortedChildren = children.entries..toList().sort((a, b) {var aVisits = a.value.visits;var bVisits = b.value.visits;if (aVisits == 0 && bVisits == 0) {return random.nextInt(100).compareTo(random.nextInt(100));}if (aVisits == 0) {return -1;}if (bVisits == 0) {return 1;}return -a.value.ucb1(currentPlayer()).compareTo(-b.value.ucb1(currentPlayer()));});return sortedChildren.first.value;}backProp() {var winner = gameState.winner;Node<MoveType, PlayerType> currentNode = this;while (currentNode != null) {currentNode.visits += 1;if (winner == null) {currentNode.draws += 1;} else {if (!currentNode.winsByPlayer.containsKey(winner)) {currentNode.winsByPlayer[winner] = 0;}currentNode.winsByPlayer[winner] += 1;}currentNode = currentNode.parent;}}Node<MoveType, PlayerType> getMostVisitedChild([List<MoveType> actualMoves]) {var currentChildren = children;if (actualMoves != null) {addNewChildrenForDetermination(actualMoves);currentChildren =Map.fromEntries(_children.entries.where((x) => x.key == move));}var sortedChildren = currentChildren.entries..toList().sort((a, b) => a.value.visits.compareTo(b.value.visits))..first.value;return sortedChildren.first.value;}}class MCTSResult<MoveType, PlayerType> {final Node<MoveType, PlayerType> root;final MoveType move;final List<Node<MoveType, PlayerType>> leafNodes;final int maxDepth;final int plays;MCTSResult({this.root, this.move, this.leafNodes, this.maxDepth, this.plays});}class MCTS<MoveType, PlayerType> {GameState<MoveType, PlayerType> gameState;double c = 1.41421356237;MCTSResult<MoveType, PlayerType> getSimulationResult(Node<MoveType, PlayerType> initialRootNode,{int iterations = 100,double maxSeconds,List<MoveType> actualMoves}) {var rootNode = initialRootNode;if (rootNode == null) {rootNode = Node(gameState: gameState, parent: null, move: null, c: c);}var plays = 0;var maxDepth = 0;var startTime = DateTime.now();var iterationsToRun = iterations;if (maxSeconds != null) {iterationsToRun = 9223372036854775807; // max integer value}while (plays < iterationsToRun) {rootNode.determine();if (maxSeconds != null) {var elapsedTime = DateTime.now().difference(startTime);if (elapsedTime.inSeconds > maxSeconds) {break;}}plays += 1;var currentNode = rootNode;while (currentNode != null &¤tNode.children.length > 0 &¤tNode.getBestChild() != null) {currentNode = currentNode.getBestChild();currentNode.resetState();}if (currentNode != null) {currentNode.backProp();maxDepth = max(maxDepth, currentNode.depth);}}var selectedMove = rootNode.getMostVisitedChild(actualMoves).move;return MCTSResult(root: rootNode, move: selectedMove, maxDepth: maxDepth, plays: plays);}}
# dartmctsA new Flutter package project.## Getting StartedThis project is a starting point for a Dart[package](https://flutter.dev/developing-packages/),a library module containing code that can be shared easily acrossmultiple Flutter or Dart projects.For help getting started with Flutter, view our[online documentation](https://flutter.dev/docs), which offers tutorials,samples, guidance on mobile development, and a full API reference.
TODO: Add your license here.
## [0.0.1] - TODO: Add release date.* TODO: Describe initial release.
# This file tracks properties of this Flutter project.# Used by Flutter tool to assess capabilities and perform upgrades etc.## This file should be version controlled and should not be manually edited.version:revision: b041144f833e05cf463b8887fa12efdec9493488channel: stableproject_type: package
# Miscellaneous*.class*.log*.pyc*.swp.DS_Store.atom/.buildlog/.history.svn/# IntelliJ related*.iml*.ipr*.iws.idea/# The .vscode folder contains launch configuration and tasks you configure in# VS Code which you may wish to be included in version control, so this line# is commented out by default.#.vscode/# Flutter/Dart/Pub related**/doc/api/.dart_tool/.flutter-plugins.flutter-plugins-dependencies.packages.pub-cache/.pub/build/# Android related**/android/**/gradle-wrapper.jar**/android/.gradle**/android/captures/**/android/gradlew**/android/gradlew.bat**/android/local.properties**/android/**/GeneratedPluginRegistrant.java# iOS/XCode related**/ios/**/*.mode1v3**/ios/**/*.mode2v3**/ios/**/*.moved-aside**/ios/**/*.pbxuser**/ios/**/*.perspectivev3**/ios/**/*sync/**/ios/**/.sconsign.dblite**/ios/**/.tags***/ios/**/.vagrant/**/ios/**/DerivedData/**/ios/**/Icon?**/ios/**/Pods/**/ios/**/.symlinks/**/ios/**/profile**/ios/**/xcuserdata**/ios/.generated/**/ios/Flutter/App.framework**/ios/Flutter/Flutter.framework**/ios/Flutter/Flutter.podspec**/ios/Flutter/Generated.xcconfig**/ios/Flutter/app.flx**/ios/Flutter/app.zip**/ios/Flutter/flutter_assets/**/ios/Flutter/flutter_export_environment.sh**/ios/ServiceDefinitions.json**/ios/Runner/GeneratedPluginRegistrant.*# Exceptions to above rules.!**/ios/**/default.mode1v3!**/ios/**/default.mode2v3!**/ios/**/default.pbxuser!**/ios/**/default.perspectivev3!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages