├── .gitignore ├── .gitmodules ├── LeelaChessZero.xcodeproj ├── project.pbxproj └── project.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ └── IDEWorkspaceChecks.plist ├── LeelaChessZero ├── BridgingObjects.h ├── BridgingObjects.mm ├── EngineBridge.h ├── EngineBridge.mm ├── Info.plist ├── LeelaChessZero.h ├── LeelaConnect.cpp ├── LeelaConnect.hpp └── LeelaSwift.swift ├── LeelaChessZeroTests ├── Info.plist └── LeelaChessZeroTests.swift ├── README.md ├── build_proto.sh ├── lc0-ios.diff └── lczero-common-ios.diff /.gitignore: -------------------------------------------------------------------------------- 1 | generated 2 | libprotobuf-lite.a 3 | libprotobuf.a 4 | */xcuserdata/* 5 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "submodules/lc0"] 2 | path = submodules/lc0 3 | url = https://github.com/LeelaChessZero/lc0.git 4 | [submodule "submodules/protobuf"] 5 | path = submodules/protobuf 6 | url = https://github.com/protocolbuffers/protobuf.git 7 | -------------------------------------------------------------------------------- /LeelaChessZero.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 50; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | CD82464D21E420B5002818C0 /* LeelaConnect.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CD82464921E420B5002818C0 /* LeelaConnect.cpp */; }; 11 | CD82464E21E420B5002818C0 /* LeelaConnect.hpp in Headers */ = {isa = PBXBuildFile; fileRef = CD82464A21E420B5002818C0 /* LeelaConnect.hpp */; }; 12 | CD82464F21E420B5002818C0 /* EngineBridge.h in Headers */ = {isa = PBXBuildFile; fileRef = CD82464B21E420B5002818C0 /* EngineBridge.h */; settings = {ATTRIBUTES = (Public, ); }; }; 13 | CD82465021E420B5002818C0 /* EngineBridge.mm in Sources */ = {isa = PBXBuildFile; fileRef = CD82464C21E420B5002818C0 /* EngineBridge.mm */; }; 14 | CD82465321E42BEA002818C0 /* BridgingObjects.h in Headers */ = {isa = PBXBuildFile; fileRef = CD82465121E42BEA002818C0 /* BridgingObjects.h */; settings = {ATTRIBUTES = (Public, ); }; }; 15 | CD82465421E42BEA002818C0 /* BridgingObjects.mm in Sources */ = {isa = PBXBuildFile; fileRef = CD82465221E42BEA002818C0 /* BridgingObjects.mm */; }; 16 | CDAE719421DD91A000358035 /* LeelaChessZero.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CDAE718A21DD91A000358035 /* LeelaChessZero.framework */; }; 17 | CDAE719921DD91A000358035 /* LeelaChessZeroTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDAE719821DD91A000358035 /* LeelaChessZeroTests.swift */; }; 18 | CDAE719B21DD91A000358035 /* LeelaChessZero.h in Headers */ = {isa = PBXBuildFile; fileRef = CDAE718D21DD91A000358035 /* LeelaChessZero.h */; settings = {ATTRIBUTES = (Public, ); }; }; 19 | CDB1407D21E15D420090572B /* libprotobuf-lite.a in Frameworks */ = {isa = PBXBuildFile; fileRef = CDB1407C21E15D420090572B /* libprotobuf-lite.a */; }; 20 | CDF5920521DDD8900083E58B /* bitboard.cc in Sources */ = {isa = PBXBuildFile; fileRef = CDF5917121DDD88F0083E58B /* bitboard.cc */; }; 21 | CDF5920821DDD8900083E58B /* position.cc in Sources */ = {isa = PBXBuildFile; fileRef = CDF5917421DDD88F0083E58B /* position.cc */; }; 22 | CDF5920A21DDD8900083E58B /* board.cc in Sources */ = {isa = PBXBuildFile; fileRef = CDF5917621DDD88F0083E58B /* board.cc */; }; 23 | CDF5920D21DDD8900083E58B /* uciloop.cc in Sources */ = {isa = PBXBuildFile; fileRef = CDF5917921DDD88F0083E58B /* uciloop.cc */; }; 24 | CDF5921221DDD8900083E58B /* string.cc in Sources */ = {isa = PBXBuildFile; fileRef = CDF5917F21DDD88F0083E58B /* string.cc */; }; 25 | CDF5921421DDD8900083E58B /* optionsparser.cc in Sources */ = {isa = PBXBuildFile; fileRef = CDF5918121DDD88F0083E58B /* optionsparser.cc */; }; 26 | CDF5921621DDD8900083E58B /* weights_adapter.cc in Sources */ = {isa = PBXBuildFile; fileRef = CDF5918321DDD88F0083E58B /* weights_adapter.cc */; }; 27 | CDF5921821DDD8900083E58B /* transpose.cc in Sources */ = {isa = PBXBuildFile; fileRef = CDF5918521DDD88F0083E58B /* transpose.cc */; }; 28 | CDF5922221DDD8900083E58B /* configfile.cc in Sources */ = {isa = PBXBuildFile; fileRef = CDF5918F21DDD88F0083E58B /* configfile.cc */; }; 29 | CDF5922321DDD8900083E58B /* histogram.cc in Sources */ = {isa = PBXBuildFile; fileRef = CDF5919021DDD88F0083E58B /* histogram.cc */; }; 30 | CDF5922521DDD8900083E58B /* commandline.cc in Sources */ = {isa = PBXBuildFile; fileRef = CDF5919221DDD88F0083E58B /* commandline.cc */; }; 31 | CDF5922621DDD8900083E58B /* random.cc in Sources */ = {isa = PBXBuildFile; fileRef = CDF5919321DDD88F0083E58B /* random.cc */; }; 32 | CDF5922B21DDD8900083E58B /* logging.cc in Sources */ = {isa = PBXBuildFile; fileRef = CDF5919821DDD88F0083E58B /* logging.cc */; }; 33 | CDF5922E21DDD8900083E58B /* optionsdict.cc in Sources */ = {isa = PBXBuildFile; fileRef = CDF5919B21DDD88F0083E58B /* optionsdict.cc */; }; 34 | CDF5923221DDD8900083E58B /* filesystem.posix.cc in Sources */ = {isa = PBXBuildFile; fileRef = CDF5919F21DDD88F0083E58B /* filesystem.posix.cc */; }; 35 | CDF5923521DDD8900083E58B /* benchmark.cc in Sources */ = {isa = PBXBuildFile; fileRef = CDF591A321DDD8900083E58B /* benchmark.cc */; }; 36 | CDF5923621DDD8900083E58B /* version.cc in Sources */ = {isa = PBXBuildFile; fileRef = CDF591A421DDD8900083E58B /* version.cc */; }; 37 | CDF5923721DDD8900083E58B /* tournament.cc in Sources */ = {isa = PBXBuildFile; fileRef = CDF591A621DDD8900083E58B /* tournament.cc */; }; 38 | CDF5923821DDD8900083E58B /* loop.cc in Sources */ = {isa = PBXBuildFile; fileRef = CDF591A721DDD8900083E58B /* loop.cc */; }; 39 | CDF5923A21DDD8900083E58B /* game.cc in Sources */ = {isa = PBXBuildFile; fileRef = CDF591A921DDD8900083E58B /* game.cc */; }; 40 | CDF5923E21DDD8900083E58B /* engine.cc in Sources */ = {isa = PBXBuildFile; fileRef = CDF591AD21DDD8900083E58B /* engine.cc */; }; 41 | CDF5924021DDD8900083E58B /* syzygy.cc in Sources */ = {isa = PBXBuildFile; fileRef = CDF591B021DDD8900083E58B /* syzygy.cc */; }; 42 | CDF5924221DDD8900083E58B /* network_random.cc in Sources */ = {isa = PBXBuildFile; fileRef = CDF591B321DDD8900083E58B /* network_random.cc */; }; 43 | CDF5924321DDD8900083E58B /* network_demux.cc in Sources */ = {isa = PBXBuildFile; fileRef = CDF591B421DDD8900083E58B /* network_demux.cc */; }; 44 | CDF5924421DDD8900083E58B /* convolution1.cc in Sources */ = {isa = PBXBuildFile; fileRef = CDF591B621DDD8900083E58B /* convolution1.cc */; }; 45 | CDF5924721DDD8900083E58B /* winograd_convolution3.cc in Sources */ = {isa = PBXBuildFile; fileRef = CDF591B921DDD8900083E58B /* winograd_convolution3.cc */; }; 46 | CDF5924921DDD8900083E58B /* network_blas.cc in Sources */ = {isa = PBXBuildFile; fileRef = CDF591BB21DDD8900083E58B /* network_blas.cc */; }; 47 | CDF5924A21DDD8900083E58B /* se_unit.cc in Sources */ = {isa = PBXBuildFile; fileRef = CDF591BC21DDD8900083E58B /* se_unit.cc */; }; 48 | CDF5924F21DDD8900083E58B /* fully_connected_layer.cc in Sources */ = {isa = PBXBuildFile; fileRef = CDF591C121DDD8900083E58B /* fully_connected_layer.cc */; }; 49 | CDF5925121DDD8900083E58B /* network_rr.cc in Sources */ = {isa = PBXBuildFile; fileRef = CDF591C321DDD8900083E58B /* network_rr.cc */; }; 50 | CDF5925E21DDD8900083E58B /* writer.cc in Sources */ = {isa = PBXBuildFile; fileRef = CDF591D121DDD8900083E58B /* writer.cc */; }; 51 | CDF5925F21DDD8900083E58B /* winograd_filter.cc in Sources */ = {isa = PBXBuildFile; fileRef = CDF591D321DDD8900083E58B /* winograd_filter.cc */; }; 52 | CDF5926221DDD8900083E58B /* activation.cc in Sources */ = {isa = PBXBuildFile; fileRef = CDF591D621DDD8900083E58B /* activation.cc */; }; 53 | CDF5926421DDD8900083E58B /* batchnorm.cc in Sources */ = {isa = PBXBuildFile; fileRef = CDF591D821DDD8900083E58B /* batchnorm.cc */; }; 54 | CDF5926521DDD8900083E58B /* loader.cc in Sources */ = {isa = PBXBuildFile; fileRef = CDF591D921DDD8900083E58B /* loader.cc */; }; 55 | CDF5926621DDD8900083E58B /* network_st_batch.cc in Sources */ = {isa = PBXBuildFile; fileRef = CDF591DA21DDD8900083E58B /* network_st_batch.cc */; }; 56 | CDF5927D21DDD8910083E58B /* network_check.cc in Sources */ = {isa = PBXBuildFile; fileRef = CDF591F421DDD8900083E58B /* network_check.cc */; }; 57 | CDF5927F21DDD8910083E58B /* factory.cc in Sources */ = {isa = PBXBuildFile; fileRef = CDF591F621DDD8900083E58B /* factory.cc */; }; 58 | CDF5928021DDD8910083E58B /* encoder.cc in Sources */ = {isa = PBXBuildFile; fileRef = CDF591F721DDD8900083E58B /* encoder.cc */; }; 59 | CDF5928121DDD8910083E58B /* cache.cc in Sources */ = {isa = PBXBuildFile; fileRef = CDF591F821DDD8900083E58B /* cache.cc */; }; 60 | CDF5928221DDD8910083E58B /* network_mux.cc in Sources */ = {isa = PBXBuildFile; fileRef = CDF591F921DDD8900083E58B /* network_mux.cc */; }; 61 | CDF5928521DDD8910083E58B /* node.cc in Sources */ = {isa = PBXBuildFile; fileRef = CDF591FD21DDD8900083E58B /* node.cc */; }; 62 | CDF5928821DDD8910083E58B /* search.cc in Sources */ = {isa = PBXBuildFile; fileRef = CDF5920021DDD8900083E58B /* search.cc */; }; 63 | CDF5928921DDD8910083E58B /* params.cc in Sources */ = {isa = PBXBuildFile; fileRef = CDF5920121DDD8900083E58B /* params.cc */; }; 64 | CDF5928F21DDDE980083E58B /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = CDF5928E21DDDE980083E58B /* libz.tbd */; }; 65 | CDF5929921DDF54B0083E58B /* network_legacy.cc in Sources */ = {isa = PBXBuildFile; fileRef = CDF591CF21DDD8900083E58B /* network_legacy.cc */; }; 66 | CDF5929D21DDFCD10083E58B /* net.pb.cc in Sources */ = {isa = PBXBuildFile; fileRef = CDF5929B21DDFCD10083E58B /* net.pb.cc */; }; 67 | CDF5929E21DDFCD10083E58B /* net.pb.h in Headers */ = {isa = PBXBuildFile; fileRef = CDF5929C21DDFCD10083E58B /* net.pb.h */; }; 68 | CDF592A221DED9540083E58B /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CDF592A121DED9540083E58B /* Accelerate.framework */; }; 69 | CDF592A421DEDD9B0083E58B /* LeelaSwift.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDF592A321DEDD9B0083E58B /* LeelaSwift.swift */; }; 70 | /* End PBXBuildFile section */ 71 | 72 | /* Begin PBXContainerItemProxy section */ 73 | CDAE719521DD91A000358035 /* PBXContainerItemProxy */ = { 74 | isa = PBXContainerItemProxy; 75 | containerPortal = CDAE718121DD91A000358035 /* Project object */; 76 | proxyType = 1; 77 | remoteGlobalIDString = CDAE718921DD91A000358035; 78 | remoteInfo = LeelaChessZero; 79 | }; 80 | /* End PBXContainerItemProxy section */ 81 | 82 | /* Begin PBXFileReference section */ 83 | CD82464921E420B5002818C0 /* LeelaConnect.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = LeelaConnect.cpp; sourceTree = ""; }; 84 | CD82464A21E420B5002818C0 /* LeelaConnect.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = LeelaConnect.hpp; sourceTree = ""; }; 85 | CD82464B21E420B5002818C0 /* EngineBridge.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EngineBridge.h; sourceTree = ""; }; 86 | CD82464C21E420B5002818C0 /* EngineBridge.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = EngineBridge.mm; sourceTree = ""; }; 87 | CD82465121E42BEA002818C0 /* BridgingObjects.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = BridgingObjects.h; sourceTree = ""; }; 88 | CD82465221E42BEA002818C0 /* BridgingObjects.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = BridgingObjects.mm; sourceTree = ""; }; 89 | CDAE718A21DD91A000358035 /* LeelaChessZero.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = LeelaChessZero.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 90 | CDAE718D21DD91A000358035 /* LeelaChessZero.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = LeelaChessZero.h; sourceTree = ""; }; 91 | CDAE718E21DD91A000358035 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 92 | CDAE719321DD91A000358035 /* LeelaChessZeroTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = LeelaChessZeroTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 93 | CDAE719821DD91A000358035 /* LeelaChessZeroTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LeelaChessZeroTests.swift; sourceTree = ""; }; 94 | CDAE719A21DD91A000358035 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 95 | CDB1407C21E15D420090572B /* libprotobuf-lite.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libprotobuf-lite.a"; sourceTree = ""; }; 96 | CDF5917121DDD88F0083E58B /* bitboard.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = bitboard.cc; sourceTree = ""; }; 97 | CDF5917221DDD88F0083E58B /* callbacks.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = callbacks.h; sourceTree = ""; }; 98 | CDF5917321DDD88F0083E58B /* position_test.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = position_test.cc; sourceTree = ""; }; 99 | CDF5917421DDD88F0083E58B /* position.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = position.cc; sourceTree = ""; }; 100 | CDF5917521DDD88F0083E58B /* bitboard.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = bitboard.h; sourceTree = ""; }; 101 | CDF5917621DDD88F0083E58B /* board.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = board.cc; sourceTree = ""; }; 102 | CDF5917721DDD88F0083E58B /* board_test.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = board_test.cc; sourceTree = ""; }; 103 | CDF5917821DDD88F0083E58B /* board.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = board.h; sourceTree = ""; }; 104 | CDF5917921DDD88F0083E58B /* uciloop.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = uciloop.cc; sourceTree = ""; }; 105 | CDF5917A21DDD88F0083E58B /* position.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = position.h; sourceTree = ""; }; 106 | CDF5917B21DDD88F0083E58B /* uciloop.h */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.h; fileEncoding = 4; path = uciloop.h; sourceTree = ""; }; 107 | CDF5917C21DDD88F0083E58B /* main.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = main.cc; path = submodules/lc0/src/main.cc; sourceTree = ""; }; 108 | CDF5917E21DDD88F0083E58B /* filesystem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = filesystem.h; sourceTree = ""; }; 109 | CDF5917F21DDD88F0083E58B /* string.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = string.cc; sourceTree = ""; }; 110 | CDF5918021DDD88F0083E58B /* cppattributes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cppattributes.h; sourceTree = ""; }; 111 | CDF5918121DDD88F0083E58B /* optionsparser.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = optionsparser.cc; sourceTree = ""; }; 112 | CDF5918221DDD88F0083E58B /* smallarray.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = smallarray.h; sourceTree = ""; }; 113 | CDF5918321DDD88F0083E58B /* weights_adapter.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = weights_adapter.cc; sourceTree = ""; }; 114 | CDF5918421DDD88F0083E58B /* filesystem.win32.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = filesystem.win32.cc; sourceTree = ""; }; 115 | CDF5918521DDD88F0083E58B /* transpose.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = transpose.cc; sourceTree = ""; }; 116 | CDF5918621DDD88F0083E58B /* weights_adapter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = weights_adapter.h; sourceTree = ""; }; 117 | CDF5918721DDD88F0083E58B /* configfile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = configfile.h; sourceTree = ""; }; 118 | CDF5918821DDD88F0083E58B /* cache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cache.h; sourceTree = ""; }; 119 | CDF5918921DDD88F0083E58B /* optionsparser_test.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = optionsparser_test.cc; sourceTree = ""; }; 120 | CDF5918A21DDD88F0083E58B /* logging.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = logging.h; sourceTree = ""; }; 121 | CDF5918B21DDD88F0083E58B /* fastmath.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fastmath.h; sourceTree = ""; }; 122 | CDF5918C21DDD88F0083E58B /* optionsparser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = optionsparser.h; sourceTree = ""; }; 123 | CDF5918D21DDD88F0083E58B /* optional.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = optional.h; sourceTree = ""; }; 124 | CDF5918E21DDD88F0083E58B /* bititer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = bititer.h; sourceTree = ""; }; 125 | CDF5918F21DDD88F0083E58B /* configfile.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = configfile.cc; sourceTree = ""; }; 126 | CDF5919021DDD88F0083E58B /* histogram.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = histogram.cc; sourceTree = ""; }; 127 | CDF5919121DDD88F0083E58B /* hashcat.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = hashcat.h; sourceTree = ""; }; 128 | CDF5919221DDD88F0083E58B /* commandline.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = commandline.cc; sourceTree = ""; }; 129 | CDF5919321DDD88F0083E58B /* random.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = random.cc; sourceTree = ""; }; 130 | CDF5919421DDD88F0083E58B /* hashcat_test.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = hashcat_test.cc; sourceTree = ""; }; 131 | CDF5919521DDD88F0083E58B /* histogram.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = histogram.h; sourceTree = ""; }; 132 | CDF5919621DDD88F0083E58B /* mutex.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mutex.h; sourceTree = ""; }; 133 | CDF5919721DDD88F0083E58B /* commandline.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = commandline.h; sourceTree = ""; }; 134 | CDF5919821DDD88F0083E58B /* logging.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = logging.cc; sourceTree = ""; }; 135 | CDF5919921DDD88F0083E58B /* cache-old.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "cache-old.h"; sourceTree = ""; }; 136 | CDF5919A21DDD88F0083E58B /* exception.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = exception.h; sourceTree = ""; }; 137 | CDF5919B21DDD88F0083E58B /* optionsdict.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = optionsdict.cc; sourceTree = ""; }; 138 | CDF5919C21DDD88F0083E58B /* transpose.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = transpose.h; sourceTree = ""; }; 139 | CDF5919D21DDD88F0083E58B /* random.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = random.h; sourceTree = ""; }; 140 | CDF5919E21DDD88F0083E58B /* string.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = string.h; sourceTree = ""; }; 141 | CDF5919F21DDD88F0083E58B /* filesystem.posix.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = filesystem.posix.cc; sourceTree = ""; }; 142 | CDF591A021DDD8900083E58B /* optionsdict.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = optionsdict.h; sourceTree = ""; }; 143 | CDF591A221DDD8900083E58B /* benchmark.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = benchmark.h; sourceTree = ""; }; 144 | CDF591A321DDD8900083E58B /* benchmark.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = benchmark.cc; sourceTree = ""; }; 145 | CDF591A421DDD8900083E58B /* version.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = version.cc; path = submodules/lc0/src/version.cc; sourceTree = ""; }; 146 | CDF591A621DDD8900083E58B /* tournament.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = tournament.cc; sourceTree = ""; }; 147 | CDF591A721DDD8900083E58B /* loop.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = loop.cc; sourceTree = ""; }; 148 | CDF591A821DDD8900083E58B /* game.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = game.h; sourceTree = ""; }; 149 | CDF591A921DDD8900083E58B /* game.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = game.cc; sourceTree = ""; }; 150 | CDF591AA21DDD8900083E58B /* loop.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = loop.h; sourceTree = ""; }; 151 | CDF591AB21DDD8900083E58B /* tournament.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = tournament.h; sourceTree = ""; }; 152 | CDF591AC21DDD8900083E58B /* engine.h */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.h; fileEncoding = 4; name = engine.h; path = submodules/lc0/src/engine.h; sourceTree = ""; }; 153 | CDF591AD21DDD8900083E58B /* engine.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = engine.cc; path = submodules/lc0/src/engine.cc; sourceTree = ""; }; 154 | CDF591AF21DDD8900083E58B /* syzygy_test.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = syzygy_test.cc; sourceTree = ""; }; 155 | CDF591B021DDD8900083E58B /* syzygy.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = syzygy.cc; sourceTree = ""; }; 156 | CDF591B121DDD8900083E58B /* syzygy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = syzygy.h; sourceTree = ""; }; 157 | CDF591B321DDD8900083E58B /* network_random.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = network_random.cc; sourceTree = ""; }; 158 | CDF591B421DDD8900083E58B /* network_demux.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = network_demux.cc; sourceTree = ""; }; 159 | CDF591B621DDD8900083E58B /* convolution1.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = convolution1.cc; sourceTree = ""; }; 160 | CDF591B721DDD8900083E58B /* winograd_transform.ispc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = winograd_transform.ispc; sourceTree = ""; }; 161 | CDF591B821DDD8900083E58B /* winograd_convolution3.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = winograd_convolution3.h; sourceTree = ""; }; 162 | CDF591B921DDD8900083E58B /* winograd_convolution3.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = winograd_convolution3.cc; sourceTree = ""; }; 163 | CDF591BA21DDD8900083E58B /* se_unit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = se_unit.h; sourceTree = ""; }; 164 | CDF591BB21DDD8900083E58B /* network_blas.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = network_blas.cc; sourceTree = ""; }; 165 | CDF591BC21DDD8900083E58B /* se_unit.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = se_unit.cc; sourceTree = ""; }; 166 | CDF591BD21DDD8900083E58B /* convolution1.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = convolution1.h; sourceTree = ""; }; 167 | CDF591BE21DDD8900083E58B /* blas.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blas.h; sourceTree = ""; }; 168 | CDF591BF21DDD8900083E58B /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; 169 | CDF591C021DDD8900083E58B /* fully_connected_layer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fully_connected_layer.h; sourceTree = ""; }; 170 | CDF591C121DDD8900083E58B /* fully_connected_layer.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = fully_connected_layer.cc; sourceTree = ""; }; 171 | CDF591C221DDD8900083E58B /* network_st_batch.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = network_st_batch.h; sourceTree = ""; }; 172 | CDF591C321DDD8900083E58B /* network_rr.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = network_rr.cc; sourceTree = ""; }; 173 | CDF591C421DDD8900083E58B /* network_legacy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = network_legacy.h; sourceTree = ""; }; 174 | CDF591CE21DDD8900083E58B /* encoder_test.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = encoder_test.cc; sourceTree = ""; }; 175 | CDF591CF21DDD8900083E58B /* network_legacy.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = network_legacy.cc; sourceTree = ""; }; 176 | CDF591D021DDD8900083E58B /* cache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cache.h; sourceTree = ""; }; 177 | CDF591D121DDD8900083E58B /* writer.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = writer.cc; sourceTree = ""; }; 178 | CDF591D321DDD8900083E58B /* winograd_filter.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = winograd_filter.cc; sourceTree = ""; }; 179 | CDF591D421DDD8900083E58B /* winograd_filter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = winograd_filter.h; sourceTree = ""; }; 180 | CDF591D521DDD8900083E58B /* batchnorm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = batchnorm.h; sourceTree = ""; }; 181 | CDF591D621DDD8900083E58B /* activation.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = activation.cc; sourceTree = ""; }; 182 | CDF591D721DDD8900083E58B /* activation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = activation.h; sourceTree = ""; }; 183 | CDF591D821DDD8900083E58B /* batchnorm.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = batchnorm.cc; sourceTree = ""; }; 184 | CDF591D921DDD8900083E58B /* loader.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = loader.cc; sourceTree = ""; }; 185 | CDF591DA21DDD8900083E58B /* network_st_batch.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = network_st_batch.cc; sourceTree = ""; }; 186 | CDF591F121DDD8900083E58B /* network_tf.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = network_tf.cc; sourceTree = ""; }; 187 | CDF591F221DDD8900083E58B /* network.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = network.h; sourceTree = ""; }; 188 | CDF591F321DDD8900083E58B /* loader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = loader.h; sourceTree = ""; }; 189 | CDF591F421DDD8900083E58B /* network_check.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = network_check.cc; sourceTree = ""; }; 190 | CDF591F521DDD8900083E58B /* encoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = encoder.h; sourceTree = ""; }; 191 | CDF591F621DDD8900083E58B /* factory.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = factory.cc; sourceTree = ""; }; 192 | CDF591F721DDD8900083E58B /* encoder.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = encoder.cc; sourceTree = ""; }; 193 | CDF591F821DDD8900083E58B /* cache.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = cache.cc; sourceTree = ""; }; 194 | CDF591F921DDD8900083E58B /* network_mux.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = network_mux.cc; sourceTree = ""; }; 195 | CDF591FA21DDD8900083E58B /* writer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = writer.h; sourceTree = ""; }; 196 | CDF591FB21DDD8900083E58B /* factory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = factory.h; sourceTree = ""; }; 197 | CDF591FD21DDD8900083E58B /* node.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = node.cc; sourceTree = ""; }; 198 | CDF591FE21DDD8900083E58B /* params.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = params.h; sourceTree = ""; }; 199 | CDF591FF21DDD8900083E58B /* node.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = node.h; sourceTree = ""; }; 200 | CDF5920021DDD8900083E58B /* search.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = search.cc; sourceTree = ""; }; 201 | CDF5920121DDD8900083E58B /* params.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = params.cc; sourceTree = ""; }; 202 | CDF5920221DDD8900083E58B /* search.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = search.h; sourceTree = ""; }; 203 | CDF5920321DDD8900083E58B /* version.inc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.pascal; name = version.inc; path = submodules/lc0/src/version.inc; sourceTree = ""; }; 204 | CDF5920421DDD8900083E58B /* version.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = version.h; path = submodules/lc0/src/version.h; sourceTree = ""; }; 205 | CDF5928E21DDDE980083E58B /* libz.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libz.tbd; path = usr/lib/libz.tbd; sourceTree = SDKROOT; }; 206 | CDF5929421DDF3920083E58B /* libprotobuf.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libprotobuf.a; sourceTree = ""; }; 207 | CDF5929B21DDFCD10083E58B /* net.pb.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = net.pb.cc; sourceTree = ""; }; 208 | CDF5929C21DDFCD10083E58B /* net.pb.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = net.pb.h; sourceTree = ""; }; 209 | CDF592A121DED9540083E58B /* Accelerate.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = System/Library/Frameworks/Accelerate.framework; sourceTree = SDKROOT; }; 210 | CDF592A321DEDD9B0083E58B /* LeelaSwift.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LeelaSwift.swift; sourceTree = ""; }; 211 | /* End PBXFileReference section */ 212 | 213 | /* Begin PBXFrameworksBuildPhase section */ 214 | CDAE718721DD91A000358035 /* Frameworks */ = { 215 | isa = PBXFrameworksBuildPhase; 216 | buildActionMask = 2147483647; 217 | files = ( 218 | CDB1407D21E15D420090572B /* libprotobuf-lite.a in Frameworks */, 219 | CDF592A221DED9540083E58B /* Accelerate.framework in Frameworks */, 220 | CDF5928F21DDDE980083E58B /* libz.tbd in Frameworks */, 221 | ); 222 | runOnlyForDeploymentPostprocessing = 0; 223 | }; 224 | CDAE719021DD91A000358035 /* Frameworks */ = { 225 | isa = PBXFrameworksBuildPhase; 226 | buildActionMask = 2147483647; 227 | files = ( 228 | CDAE719421DD91A000358035 /* LeelaChessZero.framework in Frameworks */, 229 | ); 230 | runOnlyForDeploymentPostprocessing = 0; 231 | }; 232 | /* End PBXFrameworksBuildPhase section */ 233 | 234 | /* Begin PBXGroup section */ 235 | CDAE718021DD91A000358035 = { 236 | isa = PBXGroup; 237 | children = ( 238 | CDF5929A21DDFCD10083E58B /* proto */, 239 | CDF5916F21DDD8700083E58B /* lc0 */, 240 | CDAE718C21DD91A000358035 /* LeelaChessZero */, 241 | CDAE719721DD91A000358035 /* LeelaChessZeroTests */, 242 | CDAE718B21DD91A000358035 /* Products */, 243 | CDF5928D21DDDE980083E58B /* Frameworks */, 244 | ); 245 | sourceTree = ""; 246 | }; 247 | CDAE718B21DD91A000358035 /* Products */ = { 248 | isa = PBXGroup; 249 | children = ( 250 | CDAE718A21DD91A000358035 /* LeelaChessZero.framework */, 251 | CDAE719321DD91A000358035 /* LeelaChessZeroTests.xctest */, 252 | ); 253 | name = Products; 254 | sourceTree = ""; 255 | }; 256 | CDAE718C21DD91A000358035 /* LeelaChessZero */ = { 257 | isa = PBXGroup; 258 | children = ( 259 | CDAE718E21DD91A000358035 /* Info.plist */, 260 | CD82465121E42BEA002818C0 /* BridgingObjects.h */, 261 | CD82465221E42BEA002818C0 /* BridgingObjects.mm */, 262 | CD82464B21E420B5002818C0 /* EngineBridge.h */, 263 | CD82464C21E420B5002818C0 /* EngineBridge.mm */, 264 | CDAE718D21DD91A000358035 /* LeelaChessZero.h */, 265 | CD82464921E420B5002818C0 /* LeelaConnect.cpp */, 266 | CD82464A21E420B5002818C0 /* LeelaConnect.hpp */, 267 | CDF592A321DEDD9B0083E58B /* LeelaSwift.swift */, 268 | ); 269 | path = LeelaChessZero; 270 | sourceTree = ""; 271 | }; 272 | CDAE719721DD91A000358035 /* LeelaChessZeroTests */ = { 273 | isa = PBXGroup; 274 | children = ( 275 | CDAE719821DD91A000358035 /* LeelaChessZeroTests.swift */, 276 | CDAE719A21DD91A000358035 /* Info.plist */, 277 | ); 278 | path = LeelaChessZeroTests; 279 | sourceTree = ""; 280 | }; 281 | CDF5916F21DDD8700083E58B /* lc0 */ = { 282 | isa = PBXGroup; 283 | children = ( 284 | CDF591A121DDD8900083E58B /* benchmark */, 285 | CDF5917021DDD88F0083E58B /* chess */, 286 | CDF591AD21DDD8900083E58B /* engine.cc */, 287 | CDF591AC21DDD8900083E58B /* engine.h */, 288 | CDF5917C21DDD88F0083E58B /* main.cc */, 289 | CDF591FC21DDD8900083E58B /* mcts */, 290 | CDF591B221DDD8900083E58B /* neural */, 291 | CDF591A521DDD8900083E58B /* selfplay */, 292 | CDF591AE21DDD8900083E58B /* syzygy */, 293 | CDF5917D21DDD88F0083E58B /* utils */, 294 | CDF591A421DDD8900083E58B /* version.cc */, 295 | CDF5920421DDD8900083E58B /* version.h */, 296 | CDF5920321DDD8900083E58B /* version.inc */, 297 | ); 298 | name = lc0; 299 | sourceTree = ""; 300 | }; 301 | CDF5917021DDD88F0083E58B /* chess */ = { 302 | isa = PBXGroup; 303 | children = ( 304 | CDF5917121DDD88F0083E58B /* bitboard.cc */, 305 | CDF5917721DDD88F0083E58B /* board_test.cc */, 306 | CDF5917621DDD88F0083E58B /* board.cc */, 307 | CDF5917321DDD88F0083E58B /* position_test.cc */, 308 | CDF5917421DDD88F0083E58B /* position.cc */, 309 | CDF5917921DDD88F0083E58B /* uciloop.cc */, 310 | CDF5917521DDD88F0083E58B /* bitboard.h */, 311 | CDF5917821DDD88F0083E58B /* board.h */, 312 | CDF5917221DDD88F0083E58B /* callbacks.h */, 313 | CDF5917A21DDD88F0083E58B /* position.h */, 314 | CDF5917B21DDD88F0083E58B /* uciloop.h */, 315 | ); 316 | name = chess; 317 | path = submodules/lc0/src/chess; 318 | sourceTree = ""; 319 | }; 320 | CDF5917D21DDD88F0083E58B /* utils */ = { 321 | isa = PBXGroup; 322 | children = ( 323 | CDF5919221DDD88F0083E58B /* commandline.cc */, 324 | CDF5918F21DDD88F0083E58B /* configfile.cc */, 325 | CDF5919F21DDD88F0083E58B /* filesystem.posix.cc */, 326 | CDF5918421DDD88F0083E58B /* filesystem.win32.cc */, 327 | CDF5919421DDD88F0083E58B /* hashcat_test.cc */, 328 | CDF5919021DDD88F0083E58B /* histogram.cc */, 329 | CDF5919821DDD88F0083E58B /* logging.cc */, 330 | CDF5919B21DDD88F0083E58B /* optionsdict.cc */, 331 | CDF5918921DDD88F0083E58B /* optionsparser_test.cc */, 332 | CDF5918121DDD88F0083E58B /* optionsparser.cc */, 333 | CDF5919321DDD88F0083E58B /* random.cc */, 334 | CDF5917F21DDD88F0083E58B /* string.cc */, 335 | CDF5918521DDD88F0083E58B /* transpose.cc */, 336 | CDF5918321DDD88F0083E58B /* weights_adapter.cc */, 337 | CDF5918E21DDD88F0083E58B /* bititer.h */, 338 | CDF5919921DDD88F0083E58B /* cache-old.h */, 339 | CDF5918821DDD88F0083E58B /* cache.h */, 340 | CDF5919721DDD88F0083E58B /* commandline.h */, 341 | CDF5918721DDD88F0083E58B /* configfile.h */, 342 | CDF5918021DDD88F0083E58B /* cppattributes.h */, 343 | CDF5919A21DDD88F0083E58B /* exception.h */, 344 | CDF5918B21DDD88F0083E58B /* fastmath.h */, 345 | CDF5917E21DDD88F0083E58B /* filesystem.h */, 346 | CDF5919121DDD88F0083E58B /* hashcat.h */, 347 | CDF5919521DDD88F0083E58B /* histogram.h */, 348 | CDF5918A21DDD88F0083E58B /* logging.h */, 349 | CDF5919621DDD88F0083E58B /* mutex.h */, 350 | CDF5918D21DDD88F0083E58B /* optional.h */, 351 | CDF591A021DDD8900083E58B /* optionsdict.h */, 352 | CDF5918C21DDD88F0083E58B /* optionsparser.h */, 353 | CDF5919D21DDD88F0083E58B /* random.h */, 354 | CDF5918221DDD88F0083E58B /* smallarray.h */, 355 | CDF5919E21DDD88F0083E58B /* string.h */, 356 | CDF5919C21DDD88F0083E58B /* transpose.h */, 357 | CDF5918621DDD88F0083E58B /* weights_adapter.h */, 358 | ); 359 | name = utils; 360 | path = submodules/lc0/src/utils; 361 | sourceTree = ""; 362 | }; 363 | CDF591A121DDD8900083E58B /* benchmark */ = { 364 | isa = PBXGroup; 365 | children = ( 366 | CDF591A221DDD8900083E58B /* benchmark.h */, 367 | CDF591A321DDD8900083E58B /* benchmark.cc */, 368 | ); 369 | name = benchmark; 370 | path = submodules/lc0/src/benchmark; 371 | sourceTree = ""; 372 | }; 373 | CDF591A521DDD8900083E58B /* selfplay */ = { 374 | isa = PBXGroup; 375 | children = ( 376 | CDF591A621DDD8900083E58B /* tournament.cc */, 377 | CDF591A721DDD8900083E58B /* loop.cc */, 378 | CDF591A821DDD8900083E58B /* game.h */, 379 | CDF591A921DDD8900083E58B /* game.cc */, 380 | CDF591AA21DDD8900083E58B /* loop.h */, 381 | CDF591AB21DDD8900083E58B /* tournament.h */, 382 | ); 383 | name = selfplay; 384 | path = submodules/lc0/src/selfplay; 385 | sourceTree = ""; 386 | }; 387 | CDF591AE21DDD8900083E58B /* syzygy */ = { 388 | isa = PBXGroup; 389 | children = ( 390 | CDF591AF21DDD8900083E58B /* syzygy_test.cc */, 391 | CDF591B021DDD8900083E58B /* syzygy.cc */, 392 | CDF591B121DDD8900083E58B /* syzygy.h */, 393 | ); 394 | name = syzygy; 395 | path = submodules/lc0/src/syzygy; 396 | sourceTree = ""; 397 | }; 398 | CDF591B221DDD8900083E58B /* neural */ = { 399 | isa = PBXGroup; 400 | children = ( 401 | CDF591B521DDD8900083E58B /* blas */, 402 | CDF591D221DDD8900083E58B /* shared */, 403 | CDF591F821DDD8900083E58B /* cache.cc */, 404 | CDF591CE21DDD8900083E58B /* encoder_test.cc */, 405 | CDF591F721DDD8900083E58B /* encoder.cc */, 406 | CDF591F621DDD8900083E58B /* factory.cc */, 407 | CDF591D921DDD8900083E58B /* loader.cc */, 408 | CDF591F421DDD8900083E58B /* network_check.cc */, 409 | CDF591B421DDD8900083E58B /* network_demux.cc */, 410 | CDF591CF21DDD8900083E58B /* network_legacy.cc */, 411 | CDF591F921DDD8900083E58B /* network_mux.cc */, 412 | CDF591B321DDD8900083E58B /* network_random.cc */, 413 | CDF591C321DDD8900083E58B /* network_rr.cc */, 414 | CDF591DA21DDD8900083E58B /* network_st_batch.cc */, 415 | CDF591F121DDD8900083E58B /* network_tf.cc */, 416 | CDF591D121DDD8900083E58B /* writer.cc */, 417 | CDF591D021DDD8900083E58B /* cache.h */, 418 | CDF591F521DDD8900083E58B /* encoder.h */, 419 | CDF591FB21DDD8900083E58B /* factory.h */, 420 | CDF591F321DDD8900083E58B /* loader.h */, 421 | CDF591C421DDD8900083E58B /* network_legacy.h */, 422 | CDF591C221DDD8900083E58B /* network_st_batch.h */, 423 | CDF591F221DDD8900083E58B /* network.h */, 424 | CDF591FA21DDD8900083E58B /* writer.h */, 425 | ); 426 | name = neural; 427 | path = submodules/lc0/src/neural; 428 | sourceTree = ""; 429 | }; 430 | CDF591B521DDD8900083E58B /* blas */ = { 431 | isa = PBXGroup; 432 | children = ( 433 | CDF591B621DDD8900083E58B /* convolution1.cc */, 434 | CDF591C121DDD8900083E58B /* fully_connected_layer.cc */, 435 | CDF591BB21DDD8900083E58B /* network_blas.cc */, 436 | CDF591BC21DDD8900083E58B /* se_unit.cc */, 437 | CDF591B921DDD8900083E58B /* winograd_convolution3.cc */, 438 | CDF591BE21DDD8900083E58B /* blas.h */, 439 | CDF591BD21DDD8900083E58B /* convolution1.h */, 440 | CDF591C021DDD8900083E58B /* fully_connected_layer.h */, 441 | CDF591BA21DDD8900083E58B /* se_unit.h */, 442 | CDF591B821DDD8900083E58B /* winograd_convolution3.h */, 443 | CDF591B721DDD8900083E58B /* winograd_transform.ispc */, 444 | CDF591BF21DDD8900083E58B /* README.md */, 445 | ); 446 | path = blas; 447 | sourceTree = ""; 448 | }; 449 | CDF591D221DDD8900083E58B /* shared */ = { 450 | isa = PBXGroup; 451 | children = ( 452 | CDF591D621DDD8900083E58B /* activation.cc */, 453 | CDF591D821DDD8900083E58B /* batchnorm.cc */, 454 | CDF591D321DDD8900083E58B /* winograd_filter.cc */, 455 | CDF591D721DDD8900083E58B /* activation.h */, 456 | CDF591D521DDD8900083E58B /* batchnorm.h */, 457 | CDF591D421DDD8900083E58B /* winograd_filter.h */, 458 | ); 459 | path = shared; 460 | sourceTree = ""; 461 | }; 462 | CDF591FC21DDD8900083E58B /* mcts */ = { 463 | isa = PBXGroup; 464 | children = ( 465 | CDF591FD21DDD8900083E58B /* node.cc */, 466 | CDF5920121DDD8900083E58B /* params.cc */, 467 | CDF5920021DDD8900083E58B /* search.cc */, 468 | CDF591FF21DDD8900083E58B /* node.h */, 469 | CDF591FE21DDD8900083E58B /* params.h */, 470 | CDF5920221DDD8900083E58B /* search.h */, 471 | ); 472 | name = mcts; 473 | path = submodules/lc0/src/mcts; 474 | sourceTree = ""; 475 | }; 476 | CDF5928D21DDDE980083E58B /* Frameworks */ = { 477 | isa = PBXGroup; 478 | children = ( 479 | CDB1407C21E15D420090572B /* libprotobuf-lite.a */, 480 | CDF592A121DED9540083E58B /* Accelerate.framework */, 481 | CDF5929421DDF3920083E58B /* libprotobuf.a */, 482 | CDF5928E21DDDE980083E58B /* libz.tbd */, 483 | ); 484 | name = Frameworks; 485 | sourceTree = ""; 486 | }; 487 | CDF5929A21DDFCD10083E58B /* proto */ = { 488 | isa = PBXGroup; 489 | children = ( 490 | CDF5929B21DDFCD10083E58B /* net.pb.cc */, 491 | CDF5929C21DDFCD10083E58B /* net.pb.h */, 492 | ); 493 | name = proto; 494 | path = generated/proto; 495 | sourceTree = ""; 496 | }; 497 | /* End PBXGroup section */ 498 | 499 | /* Begin PBXHeadersBuildPhase section */ 500 | CDAE718521DD91A000358035 /* Headers */ = { 501 | isa = PBXHeadersBuildPhase; 502 | buildActionMask = 2147483647; 503 | files = ( 504 | CD82464F21E420B5002818C0 /* EngineBridge.h in Headers */, 505 | CD82465321E42BEA002818C0 /* BridgingObjects.h in Headers */, 506 | CDAE719B21DD91A000358035 /* LeelaChessZero.h in Headers */, 507 | CDF5929E21DDFCD10083E58B /* net.pb.h in Headers */, 508 | CD82464E21E420B5002818C0 /* LeelaConnect.hpp in Headers */, 509 | ); 510 | runOnlyForDeploymentPostprocessing = 0; 511 | }; 512 | /* End PBXHeadersBuildPhase section */ 513 | 514 | /* Begin PBXNativeTarget section */ 515 | CDAE718921DD91A000358035 /* LeelaChessZero */ = { 516 | isa = PBXNativeTarget; 517 | buildConfigurationList = CDAE719E21DD91A000358035 /* Build configuration list for PBXNativeTarget "LeelaChessZero" */; 518 | buildPhases = ( 519 | CDAE718521DD91A000358035 /* Headers */, 520 | CDAE718621DD91A000358035 /* Sources */, 521 | CDAE718721DD91A000358035 /* Frameworks */, 522 | CDAE718821DD91A000358035 /* Resources */, 523 | ); 524 | buildRules = ( 525 | ); 526 | dependencies = ( 527 | ); 528 | name = LeelaChessZero; 529 | productName = LeelaChessZero; 530 | productReference = CDAE718A21DD91A000358035 /* LeelaChessZero.framework */; 531 | productType = "com.apple.product-type.framework"; 532 | }; 533 | CDAE719221DD91A000358035 /* LeelaChessZeroTests */ = { 534 | isa = PBXNativeTarget; 535 | buildConfigurationList = CDAE71A121DD91A000358035 /* Build configuration list for PBXNativeTarget "LeelaChessZeroTests" */; 536 | buildPhases = ( 537 | CDAE718F21DD91A000358035 /* Sources */, 538 | CDAE719021DD91A000358035 /* Frameworks */, 539 | CDAE719121DD91A000358035 /* Resources */, 540 | ); 541 | buildRules = ( 542 | ); 543 | dependencies = ( 544 | CDAE719621DD91A000358035 /* PBXTargetDependency */, 545 | ); 546 | name = LeelaChessZeroTests; 547 | productName = LeelaChessZeroTests; 548 | productReference = CDAE719321DD91A000358035 /* LeelaChessZeroTests.xctest */; 549 | productType = "com.apple.product-type.bundle.unit-test"; 550 | }; 551 | /* End PBXNativeTarget section */ 552 | 553 | /* Begin PBXProject section */ 554 | CDAE718121DD91A000358035 /* Project object */ = { 555 | isa = PBXProject; 556 | attributes = { 557 | LastSwiftUpdateCheck = 1010; 558 | LastUpgradeCheck = 1010; 559 | ORGANIZATIONNAME = "Leela Chess Zero"; 560 | TargetAttributes = { 561 | CDAE718921DD91A000358035 = { 562 | CreatedOnToolsVersion = 10.1; 563 | LastSwiftMigration = 1010; 564 | }; 565 | CDAE719221DD91A000358035 = { 566 | CreatedOnToolsVersion = 10.1; 567 | }; 568 | }; 569 | }; 570 | buildConfigurationList = CDAE718421DD91A000358035 /* Build configuration list for PBXProject "LeelaChessZero" */; 571 | compatibilityVersion = "Xcode 9.3"; 572 | developmentRegion = en; 573 | hasScannedForEncodings = 0; 574 | knownRegions = ( 575 | en, 576 | ); 577 | mainGroup = CDAE718021DD91A000358035; 578 | productRefGroup = CDAE718B21DD91A000358035 /* Products */; 579 | projectDirPath = ""; 580 | projectRoot = ""; 581 | targets = ( 582 | CDAE718921DD91A000358035 /* LeelaChessZero */, 583 | CDAE719221DD91A000358035 /* LeelaChessZeroTests */, 584 | ); 585 | }; 586 | /* End PBXProject section */ 587 | 588 | /* Begin PBXResourcesBuildPhase section */ 589 | CDAE718821DD91A000358035 /* Resources */ = { 590 | isa = PBXResourcesBuildPhase; 591 | buildActionMask = 2147483647; 592 | files = ( 593 | ); 594 | runOnlyForDeploymentPostprocessing = 0; 595 | }; 596 | CDAE719121DD91A000358035 /* Resources */ = { 597 | isa = PBXResourcesBuildPhase; 598 | buildActionMask = 2147483647; 599 | files = ( 600 | ); 601 | runOnlyForDeploymentPostprocessing = 0; 602 | }; 603 | /* End PBXResourcesBuildPhase section */ 604 | 605 | /* Begin PBXSourcesBuildPhase section */ 606 | CDAE718621DD91A000358035 /* Sources */ = { 607 | isa = PBXSourcesBuildPhase; 608 | buildActionMask = 2147483647; 609 | files = ( 610 | CDF5924F21DDD8900083E58B /* fully_connected_layer.cc in Sources */, 611 | CDF5925121DDD8900083E58B /* network_rr.cc in Sources */, 612 | CDF5923221DDD8900083E58B /* filesystem.posix.cc in Sources */, 613 | CDF5926521DDD8900083E58B /* loader.cc in Sources */, 614 | CDF5924921DDD8900083E58B /* network_blas.cc in Sources */, 615 | CDF5928521DDD8910083E58B /* node.cc in Sources */, 616 | CDF5921821DDD8900083E58B /* transpose.cc in Sources */, 617 | CDF5924021DDD8900083E58B /* syzygy.cc in Sources */, 618 | CD82465021E420B5002818C0 /* EngineBridge.mm in Sources */, 619 | CDF5923521DDD8900083E58B /* benchmark.cc in Sources */, 620 | CDF5927F21DDD8910083E58B /* factory.cc in Sources */, 621 | CDF5924421DDD8900083E58B /* convolution1.cc in Sources */, 622 | CDF5922B21DDD8900083E58B /* logging.cc in Sources */, 623 | CDF5921621DDD8900083E58B /* weights_adapter.cc in Sources */, 624 | CDF5924A21DDD8900083E58B /* se_unit.cc in Sources */, 625 | CDF5925F21DDD8900083E58B /* winograd_filter.cc in Sources */, 626 | CDF5923621DDD8900083E58B /* version.cc in Sources */, 627 | CDF5923821DDD8900083E58B /* loop.cc in Sources */, 628 | CDF5928221DDD8910083E58B /* network_mux.cc in Sources */, 629 | CDF5920D21DDD8900083E58B /* uciloop.cc in Sources */, 630 | CDF5926621DDD8900083E58B /* network_st_batch.cc in Sources */, 631 | CDF5921421DDD8900083E58B /* optionsparser.cc in Sources */, 632 | CDF5922621DDD8900083E58B /* random.cc in Sources */, 633 | CDF5924221DDD8900083E58B /* network_random.cc in Sources */, 634 | CDF5923721DDD8900083E58B /* tournament.cc in Sources */, 635 | CDF5922221DDD8900083E58B /* configfile.cc in Sources */, 636 | CDF5921221DDD8900083E58B /* string.cc in Sources */, 637 | CDF5923A21DDD8900083E58B /* game.cc in Sources */, 638 | CDF5922E21DDD8900083E58B /* optionsdict.cc in Sources */, 639 | CDF5926421DDD8900083E58B /* batchnorm.cc in Sources */, 640 | CDF5920821DDD8900083E58B /* position.cc in Sources */, 641 | CDF5920521DDD8900083E58B /* bitboard.cc in Sources */, 642 | CDF5922521DDD8900083E58B /* commandline.cc in Sources */, 643 | CDF5923E21DDD8900083E58B /* engine.cc in Sources */, 644 | CDF5924321DDD8900083E58B /* network_demux.cc in Sources */, 645 | CDF5928921DDD8910083E58B /* params.cc in Sources */, 646 | CD82465421E42BEA002818C0 /* BridgingObjects.mm in Sources */, 647 | CDF5929D21DDFCD10083E58B /* net.pb.cc in Sources */, 648 | CDF5920A21DDD8900083E58B /* board.cc in Sources */, 649 | CDF5924721DDD8900083E58B /* winograd_convolution3.cc in Sources */, 650 | CDF5928821DDD8910083E58B /* search.cc in Sources */, 651 | CDF5925E21DDD8900083E58B /* writer.cc in Sources */, 652 | CDF5922321DDD8900083E58B /* histogram.cc in Sources */, 653 | CDF5928121DDD8910083E58B /* cache.cc in Sources */, 654 | CDF5927D21DDD8910083E58B /* network_check.cc in Sources */, 655 | CDF5929921DDF54B0083E58B /* network_legacy.cc in Sources */, 656 | CDF5928021DDD8910083E58B /* encoder.cc in Sources */, 657 | CDF592A421DEDD9B0083E58B /* LeelaSwift.swift in Sources */, 658 | CD82464D21E420B5002818C0 /* LeelaConnect.cpp in Sources */, 659 | CDF5926221DDD8900083E58B /* activation.cc in Sources */, 660 | ); 661 | runOnlyForDeploymentPostprocessing = 0; 662 | }; 663 | CDAE718F21DD91A000358035 /* Sources */ = { 664 | isa = PBXSourcesBuildPhase; 665 | buildActionMask = 2147483647; 666 | files = ( 667 | CDAE719921DD91A000358035 /* LeelaChessZeroTests.swift in Sources */, 668 | ); 669 | runOnlyForDeploymentPostprocessing = 0; 670 | }; 671 | /* End PBXSourcesBuildPhase section */ 672 | 673 | /* Begin PBXTargetDependency section */ 674 | CDAE719621DD91A000358035 /* PBXTargetDependency */ = { 675 | isa = PBXTargetDependency; 676 | target = CDAE718921DD91A000358035 /* LeelaChessZero */; 677 | targetProxy = CDAE719521DD91A000358035 /* PBXContainerItemProxy */; 678 | }; 679 | /* End PBXTargetDependency section */ 680 | 681 | /* Begin XCBuildConfiguration section */ 682 | CDAE719C21DD91A000358035 /* Debug */ = { 683 | isa = XCBuildConfiguration; 684 | buildSettings = { 685 | ALWAYS_SEARCH_USER_PATHS = NO; 686 | CLANG_ANALYZER_NONNULL = YES; 687 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 688 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 689 | CLANG_CXX_LIBRARY = "libc++"; 690 | CLANG_ENABLE_MODULES = YES; 691 | CLANG_ENABLE_OBJC_ARC = YES; 692 | CLANG_ENABLE_OBJC_WEAK = YES; 693 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 694 | CLANG_WARN_BOOL_CONVERSION = YES; 695 | CLANG_WARN_COMMA = YES; 696 | CLANG_WARN_CONSTANT_CONVERSION = YES; 697 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 698 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 699 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 700 | CLANG_WARN_EMPTY_BODY = YES; 701 | CLANG_WARN_ENUM_CONVERSION = YES; 702 | CLANG_WARN_INFINITE_RECURSION = YES; 703 | CLANG_WARN_INT_CONVERSION = YES; 704 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 705 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 706 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 707 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 708 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 709 | CLANG_WARN_STRICT_PROTOTYPES = YES; 710 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 711 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 712 | CLANG_WARN_UNREACHABLE_CODE = YES; 713 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 714 | CODE_SIGN_IDENTITY = "iPhone Developer"; 715 | COPY_PHASE_STRIP = NO; 716 | CURRENT_PROJECT_VERSION = 1; 717 | DEBUG_INFORMATION_FORMAT = dwarf; 718 | ENABLE_STRICT_OBJC_MSGSEND = YES; 719 | ENABLE_TESTABILITY = YES; 720 | GCC_C_LANGUAGE_STANDARD = gnu11; 721 | GCC_DYNAMIC_NO_PIC = NO; 722 | GCC_NO_COMMON_BLOCKS = YES; 723 | GCC_OPTIMIZATION_LEVEL = 0; 724 | GCC_PREPROCESSOR_DEFINITIONS = ( 725 | "DEBUG=1", 726 | "$(inherited)", 727 | ); 728 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 729 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 730 | GCC_WARN_UNDECLARED_SELECTOR = YES; 731 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 732 | GCC_WARN_UNUSED_FUNCTION = YES; 733 | GCC_WARN_UNUSED_VARIABLE = YES; 734 | IPHONEOS_DEPLOYMENT_TARGET = 12.1; 735 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; 736 | MTL_FAST_MATH = YES; 737 | ONLY_ACTIVE_ARCH = YES; 738 | SDKROOT = iphoneos; 739 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 740 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 741 | VERSIONING_SYSTEM = "apple-generic"; 742 | VERSION_INFO_PREFIX = ""; 743 | }; 744 | name = Debug; 745 | }; 746 | CDAE719D21DD91A000358035 /* Release */ = { 747 | isa = XCBuildConfiguration; 748 | buildSettings = { 749 | ALWAYS_SEARCH_USER_PATHS = NO; 750 | CLANG_ANALYZER_NONNULL = YES; 751 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 752 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 753 | CLANG_CXX_LIBRARY = "libc++"; 754 | CLANG_ENABLE_MODULES = YES; 755 | CLANG_ENABLE_OBJC_ARC = YES; 756 | CLANG_ENABLE_OBJC_WEAK = YES; 757 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 758 | CLANG_WARN_BOOL_CONVERSION = YES; 759 | CLANG_WARN_COMMA = YES; 760 | CLANG_WARN_CONSTANT_CONVERSION = YES; 761 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 762 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 763 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 764 | CLANG_WARN_EMPTY_BODY = YES; 765 | CLANG_WARN_ENUM_CONVERSION = YES; 766 | CLANG_WARN_INFINITE_RECURSION = YES; 767 | CLANG_WARN_INT_CONVERSION = YES; 768 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 769 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 770 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 771 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 772 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 773 | CLANG_WARN_STRICT_PROTOTYPES = YES; 774 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 775 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 776 | CLANG_WARN_UNREACHABLE_CODE = YES; 777 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 778 | CODE_SIGN_IDENTITY = "iPhone Developer"; 779 | COPY_PHASE_STRIP = NO; 780 | CURRENT_PROJECT_VERSION = 1; 781 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 782 | ENABLE_NS_ASSERTIONS = NO; 783 | ENABLE_STRICT_OBJC_MSGSEND = YES; 784 | GCC_C_LANGUAGE_STANDARD = gnu11; 785 | GCC_NO_COMMON_BLOCKS = YES; 786 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 787 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 788 | GCC_WARN_UNDECLARED_SELECTOR = YES; 789 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 790 | GCC_WARN_UNUSED_FUNCTION = YES; 791 | GCC_WARN_UNUSED_VARIABLE = YES; 792 | IPHONEOS_DEPLOYMENT_TARGET = 12.1; 793 | MTL_ENABLE_DEBUG_INFO = NO; 794 | MTL_FAST_MATH = YES; 795 | SDKROOT = iphoneos; 796 | SWIFT_COMPILATION_MODE = wholemodule; 797 | SWIFT_OPTIMIZATION_LEVEL = "-O"; 798 | VALIDATE_PRODUCT = YES; 799 | VERSIONING_SYSTEM = "apple-generic"; 800 | VERSION_INFO_PREFIX = ""; 801 | }; 802 | name = Release; 803 | }; 804 | CDAE719F21DD91A000358035 /* Debug */ = { 805 | isa = XCBuildConfiguration; 806 | buildSettings = { 807 | CLANG_CXX_LIBRARY = "libc++"; 808 | CLANG_ENABLE_MODULES = YES; 809 | CODE_SIGN_IDENTITY = ""; 810 | CODE_SIGN_STYLE = Automatic; 811 | DEFINES_MODULE = YES; 812 | DEVELOPMENT_TEAM = GNE4VFAE6G; 813 | DYLIB_COMPATIBILITY_VERSION = 1; 814 | DYLIB_CURRENT_VERSION = 1; 815 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 816 | HEADER_SEARCH_PATHS = ( 817 | "$(SRCROOT)/submodules/lc0/src", 818 | "$(SRCROOT)/submodules/lc0/third_party", 819 | "$(SRCROOT)/submodules/protobuf/src", 820 | "$(SRCROOT)/generated", 821 | ); 822 | INFOPLIST_FILE = LeelaChessZero/Info.plist; 823 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 824 | LD_RUNPATH_SEARCH_PATHS = ( 825 | "$(inherited)", 826 | "@executable_path/Frameworks", 827 | "@loader_path/Frameworks", 828 | ); 829 | LIBRARY_SEARCH_PATHS = ( 830 | "$(inherited)", 831 | "$(PROJECT_DIR)", 832 | ); 833 | PRODUCT_BUNDLE_IDENTIFIER = com.dpedley.LeelaChessZero; 834 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 835 | SKIP_INSTALL = YES; 836 | SWIFT_OBJC_BRIDGING_HEADER = ""; 837 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 838 | SWIFT_VERSION = 4.2; 839 | SYSTEM_HEADER_SEARCH_PATHS = ""; 840 | TARGETED_DEVICE_FAMILY = "1,2"; 841 | }; 842 | name = Debug; 843 | }; 844 | CDAE71A021DD91A000358035 /* Release */ = { 845 | isa = XCBuildConfiguration; 846 | buildSettings = { 847 | CLANG_CXX_LIBRARY = "libc++"; 848 | CLANG_ENABLE_MODULES = YES; 849 | CODE_SIGN_IDENTITY = ""; 850 | CODE_SIGN_STYLE = Automatic; 851 | DEFINES_MODULE = YES; 852 | DEVELOPMENT_TEAM = GNE4VFAE6G; 853 | DYLIB_COMPATIBILITY_VERSION = 1; 854 | DYLIB_CURRENT_VERSION = 1; 855 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 856 | HEADER_SEARCH_PATHS = ( 857 | "$(SRCROOT)/submodules/lc0/src", 858 | "$(SRCROOT)/submodules/lc0/third_party", 859 | "$(SRCROOT)/submodules/protobuf/src", 860 | "$(SRCROOT)/generated", 861 | ); 862 | INFOPLIST_FILE = LeelaChessZero/Info.plist; 863 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 864 | LD_RUNPATH_SEARCH_PATHS = ( 865 | "$(inherited)", 866 | "@executable_path/Frameworks", 867 | "@loader_path/Frameworks", 868 | ); 869 | LIBRARY_SEARCH_PATHS = ( 870 | "$(inherited)", 871 | "$(PROJECT_DIR)", 872 | ); 873 | PRODUCT_BUNDLE_IDENTIFIER = com.dpedley.LeelaChessZero; 874 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 875 | SKIP_INSTALL = YES; 876 | SWIFT_OBJC_BRIDGING_HEADER = ""; 877 | SWIFT_VERSION = 4.2; 878 | SYSTEM_HEADER_SEARCH_PATHS = ""; 879 | TARGETED_DEVICE_FAMILY = "1,2"; 880 | }; 881 | name = Release; 882 | }; 883 | CDAE71A221DD91A000358035 /* Debug */ = { 884 | isa = XCBuildConfiguration; 885 | buildSettings = { 886 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 887 | CODE_SIGN_STYLE = Automatic; 888 | DEVELOPMENT_TEAM = GNE4VFAE6G; 889 | INFOPLIST_FILE = LeelaChessZeroTests/Info.plist; 890 | LD_RUNPATH_SEARCH_PATHS = ( 891 | "$(inherited)", 892 | "@executable_path/Frameworks", 893 | "@loader_path/Frameworks", 894 | ); 895 | PRODUCT_BUNDLE_IDENTIFIER = com.dpedley.LeelaChessZeroTests; 896 | PRODUCT_NAME = "$(TARGET_NAME)"; 897 | SWIFT_VERSION = 4.2; 898 | TARGETED_DEVICE_FAMILY = "1,2"; 899 | }; 900 | name = Debug; 901 | }; 902 | CDAE71A321DD91A000358035 /* Release */ = { 903 | isa = XCBuildConfiguration; 904 | buildSettings = { 905 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 906 | CODE_SIGN_STYLE = Automatic; 907 | DEVELOPMENT_TEAM = GNE4VFAE6G; 908 | INFOPLIST_FILE = LeelaChessZeroTests/Info.plist; 909 | LD_RUNPATH_SEARCH_PATHS = ( 910 | "$(inherited)", 911 | "@executable_path/Frameworks", 912 | "@loader_path/Frameworks", 913 | ); 914 | PRODUCT_BUNDLE_IDENTIFIER = com.dpedley.LeelaChessZeroTests; 915 | PRODUCT_NAME = "$(TARGET_NAME)"; 916 | SWIFT_VERSION = 4.2; 917 | TARGETED_DEVICE_FAMILY = "1,2"; 918 | }; 919 | name = Release; 920 | }; 921 | /* End XCBuildConfiguration section */ 922 | 923 | /* Begin XCConfigurationList section */ 924 | CDAE718421DD91A000358035 /* Build configuration list for PBXProject "LeelaChessZero" */ = { 925 | isa = XCConfigurationList; 926 | buildConfigurations = ( 927 | CDAE719C21DD91A000358035 /* Debug */, 928 | CDAE719D21DD91A000358035 /* Release */, 929 | ); 930 | defaultConfigurationIsVisible = 0; 931 | defaultConfigurationName = Release; 932 | }; 933 | CDAE719E21DD91A000358035 /* Build configuration list for PBXNativeTarget "LeelaChessZero" */ = { 934 | isa = XCConfigurationList; 935 | buildConfigurations = ( 936 | CDAE719F21DD91A000358035 /* Debug */, 937 | CDAE71A021DD91A000358035 /* Release */, 938 | ); 939 | defaultConfigurationIsVisible = 0; 940 | defaultConfigurationName = Release; 941 | }; 942 | CDAE71A121DD91A000358035 /* Build configuration list for PBXNativeTarget "LeelaChessZeroTests" */ = { 943 | isa = XCConfigurationList; 944 | buildConfigurations = ( 945 | CDAE71A221DD91A000358035 /* Debug */, 946 | CDAE71A321DD91A000358035 /* Release */, 947 | ); 948 | defaultConfigurationIsVisible = 0; 949 | defaultConfigurationName = Release; 950 | }; 951 | /* End XCConfigurationList section */ 952 | }; 953 | rootObject = CDAE718121DD91A000358035 /* Project object */; 954 | } 955 | -------------------------------------------------------------------------------- /LeelaChessZero.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /LeelaChessZero.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /LeelaChessZero/BridgingObjects.h: -------------------------------------------------------------------------------- 1 | /* 2 | This file is part of Leela Chess Zero. 3 | Copyright (C) 2018 The LCZero Authors 4 | 5 | Leela Chess is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU General Public License as published by 7 | the Free Software Foundation, either version 3 of the License, or 8 | (at your option) any later version. 9 | 10 | Leela Chess is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU General Public License for more details. 14 | 15 | You should have received a copy of the GNU General Public License 16 | along with Leela Chess. If not, see . 17 | 18 | Additional permission under GNU GPL version 3 section 7 19 | 20 | If you modify this Program, or any covered work, by linking or 21 | combining it with NVIDIA Corporation's libraries from the NVIDIA CUDA 22 | Toolkit and the NVIDIA CUDA Deep Neural Network library (or a 23 | modified version of those libraries), containing parts covered by the 24 | terms of the respective license agreement, the licensors of this 25 | Program grant you additional permission to convey the resulting work. 26 | */ 27 | 28 | #import 29 | 30 | NS_ASSUME_NONNULL_BEGIN 31 | 32 | #define GoParam_TimeInterval_NotUsed (-867.5309f) 33 | #define GoParam_Integer_NotUsed -7734 34 | 35 | @interface LCZero_GoParameters : NSObject 36 | @property NSTimeInterval wtime; 37 | @property NSTimeInterval btime; 38 | @property NSTimeInterval winc; 39 | @property NSTimeInterval binc; 40 | @property NSInteger movestogo; 41 | @property NSInteger depth; 42 | @property NSInteger nodes; 43 | @property NSTimeInterval movetime; 44 | @property Boolean infinite; 45 | @property NSArray *searchmoves; 46 | @property Boolean ponder; 47 | @end 48 | 49 | @interface LCZero_BestMoveInfo : NSObject 50 | 51 | @property (nonatomic, copy) NSString *bestmove; 52 | @property (nonatomic, copy) NSString *ponder; 53 | @property NSInteger player; 54 | @property NSInteger game_id; 55 | @property Boolean is_black; 56 | 57 | @end 58 | 59 | @interface LCZero_Thought : NSObject 60 | 61 | @property (nonatomic, copy) NSArray *line; // Array of Move Strings 62 | @property NSInteger player; 63 | @property NSInteger game_id; 64 | @property Boolean is_black; 65 | @property NSInteger depth; 66 | @property NSInteger seldepth; 67 | @property NSInteger time; 68 | @property NSInteger nodes; 69 | @property NSInteger score; 70 | @property NSInteger hashfull; 71 | @property NSInteger nps; 72 | @property NSInteger tb_hits; 73 | @property NSInteger multipv; 74 | 75 | @end 76 | 77 | 78 | NS_ASSUME_NONNULL_END 79 | -------------------------------------------------------------------------------- /LeelaChessZero/BridgingObjects.mm: -------------------------------------------------------------------------------- 1 | /* 2 | This file is part of Leela Chess Zero. 3 | Copyright (C) 2018 The LCZero Authors 4 | 5 | Leela Chess is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU General Public License as published by 7 | the Free Software Foundation, either version 3 of the License, or 8 | (at your option) any later version. 9 | 10 | Leela Chess is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU General Public License for more details. 14 | 15 | You should have received a copy of the GNU General Public License 16 | along with Leela Chess. If not, see . 17 | 18 | Additional permission under GNU GPL version 3 section 7 19 | 20 | If you modify this Program, or any covered work, by linking or 21 | combining it with NVIDIA Corporation's libraries from the NVIDIA CUDA 22 | Toolkit and the NVIDIA CUDA Deep Neural Network library (or a 23 | modified version of those libraries), containing parts covered by the 24 | terms of the respective license agreement, the licensors of this 25 | Program grant you additional permission to convey the resulting work. 26 | */ 27 | 28 | #import "BridgingObjects.h" 29 | 30 | 31 | @implementation LCZero_GoParameters 32 | 33 | @synthesize wtime; 34 | @synthesize btime; 35 | @synthesize winc; 36 | @synthesize binc; 37 | @synthesize movestogo; 38 | @synthesize depth; 39 | @synthesize nodes; 40 | @synthesize movetime; 41 | @synthesize infinite; 42 | @synthesize searchmoves; 43 | @synthesize ponder; 44 | 45 | @end 46 | 47 | @implementation LCZero_BestMoveInfo 48 | 49 | @synthesize bestmove; 50 | @synthesize ponder; 51 | @synthesize player; 52 | @synthesize game_id; 53 | @synthesize is_black; 54 | 55 | -(NSString *)description { 56 | return [NSString stringWithFormat:@"LCZero_BestMoveInfo: %@ %@ %ld %ld %ld", bestmove, ponder, (long)player, (long)game_id, (long)is_black]; 57 | } 58 | 59 | @end 60 | 61 | @implementation LCZero_Thought 62 | 63 | @synthesize line; 64 | @synthesize player; 65 | @synthesize game_id; 66 | @synthesize is_black; 67 | @synthesize depth; 68 | @synthesize seldepth; 69 | @synthesize time; 70 | @synthesize nodes; 71 | @synthesize score; 72 | @synthesize hashfull; 73 | @synthesize nps; 74 | @synthesize tb_hits; 75 | @synthesize multipv; 76 | 77 | -(NSString *)description { 78 | return [NSString stringWithFormat:@"LCZero_Thought: %@ %ld %ld %ld", line, (long)player, (long)game_id, (long)is_black]; 79 | } 80 | 81 | @end 82 | -------------------------------------------------------------------------------- /LeelaChessZero/EngineBridge.h: -------------------------------------------------------------------------------- 1 | /* 2 | This file is part of Leela Chess Zero. 3 | Copyright (C) 2018 The LCZero Authors 4 | 5 | Leela Chess is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU General Public License as published by 7 | the Free Software Foundation, either version 3 of the License, or 8 | (at your option) any later version. 9 | 10 | Leela Chess is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU General Public License for more details. 14 | 15 | You should have received a copy of the GNU General Public License 16 | along with Leela Chess. If not, see . 17 | 18 | Additional permission under GNU GPL version 3 section 7 19 | 20 | If you modify this Program, or any covered work, by linking or 21 | combining it with NVIDIA Corporation's libraries from the NVIDIA CUDA 22 | Toolkit and the NVIDIA CUDA Deep Neural Network library (or a 23 | modified version of those libraries), containing parts covered by the 24 | terms of the respective license agreement, the licensors of this 25 | Program grant you additional permission to convey the resulting work. 26 | */ 27 | 28 | #import 29 | #import "BridgingObjects.h" 30 | 31 | NS_ASSUME_NONNULL_BEGIN 32 | 33 | typedef void (^LCZero_BestMoveCompletion)(LCZero_BestMoveInfo *bestMoveInfo); 34 | typedef void (^LCZero_ThoughtCompletion)(NSArray *thoughts); // Array of LCZero_Thought 35 | 36 | @interface LCZero_EngineBridge : NSObject 37 | 38 | @property (nonatomic, copy) LCZero_BestMoveCompletion bestMoveBlock; 39 | @property (nonatomic, copy) LCZero_ThoughtCompletion thoughtBlock; 40 | 41 | - (void)setupWeights:(NSString *)filePath; 42 | - (void)sendUCI; 43 | - (void)sendIsReady; 44 | - (void)sendNewGame; 45 | - (void)sendSetOption:(NSString *)key value:(NSString *)value context:(NSString *)context; 46 | - (void)sendPosition:(NSString *)FEN moves:(NSArray *)moveStrings; 47 | - (void)sendGo:(LCZero_GoParameters *)goParams; 48 | - (void)sendPonderHit; 49 | - (void)sendStop; 50 | 51 | @end 52 | 53 | NS_ASSUME_NONNULL_END 54 | -------------------------------------------------------------------------------- /LeelaChessZero/EngineBridge.mm: -------------------------------------------------------------------------------- 1 | /* 2 | This file is part of Leela Chess Zero. 3 | Copyright (C) 2018 The LCZero Authors 4 | 5 | Leela Chess is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU General Public License as published by 7 | the Free Software Foundation, either version 3 of the License, or 8 | (at your option) any later version. 9 | 10 | Leela Chess is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU General Public License for more details. 14 | 15 | You should have received a copy of the GNU General Public License 16 | along with Leela Chess. If not, see . 17 | 18 | Additional permission under GNU GPL version 3 section 7 19 | 20 | If you modify this Program, or any covered work, by linking or 21 | combining it with NVIDIA Corporation's libraries from the NVIDIA CUDA 22 | Toolkit and the NVIDIA CUDA Deep Neural Network library (or a 23 | modified version of those libraries), containing parts covered by the 24 | terms of the respective license agreement, the licensors of this 25 | Program grant you additional permission to convey the resulting work. 26 | */ 27 | 28 | #import "EngineBridge.h" 29 | #include "engine.h" 30 | #include "LeelaConnect.hpp" 31 | #include 32 | #include 33 | 34 | @interface LCZero_EngineBridge () 35 | 36 | @property lczero::LeelaConnect *leela; 37 | 38 | @end 39 | 40 | @implementation LCZero_EngineBridge 41 | 42 | - (instancetype)init 43 | { 44 | self = [super init]; 45 | if (self) { 46 | __weak typeof(self) weakSelf = self; 47 | self.leela = new lczero::LeelaConnect(); 48 | dispatch_block_t bestMoveBlock = ^{ 49 | // This is the best move block 50 | __strong typeof(weakSelf) strongSelf = weakSelf; 51 | if (strongSelf) { 52 | // TODO logging 53 | // NSLog(@"Best move: %@", strongSelf.leela->bestMoveInfo); 54 | if (strongSelf.bestMoveBlock) { 55 | LCZero_BestMoveInfo *info = [[LCZero_BestMoveInfo alloc] init]; 56 | 57 | info.bestmove = [NSString stringWithCString:strongSelf.leela->bestMoveInfo.bestmove.as_string().c_str() encoding:NSUTF8StringEncoding]; 58 | info.ponder = [NSString stringWithCString:strongSelf.leela->bestMoveInfo.ponder.as_string().c_str() encoding:NSUTF8StringEncoding]; 59 | info.game_id = strongSelf.leela->bestMoveInfo.game_id; 60 | info.player = strongSelf.leela->bestMoveInfo.player; 61 | info.is_black = strongSelf.leela->bestMoveInfo.is_black; 62 | strongSelf.bestMoveBlock(info); 63 | } 64 | } 65 | }; 66 | 67 | self.leela->setBestMoveBlock([bestMoveBlock copy]); 68 | 69 | dispatch_block_t thoughtBlock = ^{ 70 | // This is the though info block 71 | __strong typeof(weakSelf) strongSelf = weakSelf; 72 | if (strongSelf) { 73 | // TODO logging 74 | if (strongSelf.thoughtBlock) { 75 | NSMutableArray *thoughts = [[NSMutableArray alloc] init]; 76 | for (const auto& thought : strongSelf.leela->thinkingInfos) { 77 | 78 | LCZero_Thought *bridgeInfo = [[LCZero_Thought alloc] init]; 79 | 80 | bridgeInfo.player = thought.player; 81 | bridgeInfo.depth = thought.depth; 82 | bridgeInfo.game_id = thought.game_id; 83 | bridgeInfo.is_black = thought.is_black; 84 | bridgeInfo.multipv = thought.multipv; 85 | bridgeInfo.nodes = thought.nodes; 86 | bridgeInfo.seldepth = thought.seldepth; 87 | bridgeInfo.time = thought.time; 88 | bridgeInfo.score = thought.score; 89 | bridgeInfo.hashfull = thought.hashfull; 90 | bridgeInfo.nps = thought.nps; 91 | bridgeInfo.tb_hits = thought.tb_hits; 92 | NSMutableArray *line = [[NSMutableArray alloc] init]; 93 | if (thought.pv.size()>0) { 94 | for (int i=0; isetThoughtBlock([thoughtBlock copy]); 108 | } 109 | return self; 110 | } 111 | 112 | -(void)dealloc { 113 | delete _leela; 114 | } 115 | 116 | // All the UCI send throughs 117 | - (void)sendUCI { self.leela->CmdUci(); } 118 | - (void)sendIsReady { self.leela->CmdIsReady(); } 119 | - (void)sendNewGame { self.leela->CmdUciNewGame(); } 120 | - (void)sendPonderHit { self.leela->CmdPonderHit(); } 121 | - (void)sendStop { self.leela->CmdStop(); } 122 | - (void)setupWeights:(NSString *)filePath { 123 | NSLog(@"Initializing with weight file: %@", filePath); 124 | std::string filePathString = std::string([filePath UTF8String]); 125 | self.leela->SetupWeights(filePathString); 126 | } 127 | - (void)sendSetOption:(NSString *)key value:(NSString *)value context:(NSString *)context { 128 | std::string keyString = std::string([key UTF8String]); 129 | std::string valueString = std::string([value UTF8String]); 130 | std::string contextString = std::string([context UTF8String]); 131 | self.leela->CmdSetOption(keyString, valueString, contextString); 132 | } 133 | - (void)sendPosition:(NSString *)FEN moves:(NSArray *)moveStrings { 134 | std::string fenString = std::string([FEN UTF8String]); 135 | // TODO: plumb moves 136 | std::vector moves; 137 | // [moveStrings enumerateObjectsUsingBlock:^(NSString *move, NSUInteger idx, BOOL * _Nonnull stop) { 138 | // std::string moveString = std::string([move UTF8String]); 139 | // moves.insert(moves.back(), &moveString); 140 | // }]; 141 | 142 | self.leela->CmdPosition(fenString, moves); 143 | } 144 | 145 | - (void)sendGo:(LCZero_GoParameters *)goParams { 146 | 147 | lczero::GoParams *bridgedParams = new lczero::GoParams; 148 | bridgedParams->infinite = goParams.infinite; 149 | bridgedParams->ponder = goParams.ponder; 150 | 151 | // We fake the optionals here 152 | if (goParams.wtime != GoParam_TimeInterval_NotUsed) { bridgedParams->wtime = goParams.wtime; } 153 | if (goParams.btime != GoParam_TimeInterval_NotUsed) { bridgedParams->btime = goParams.btime; } 154 | if (goParams.winc != GoParam_TimeInterval_NotUsed) { bridgedParams->winc = goParams.winc; } 155 | if (goParams.binc != GoParam_TimeInterval_NotUsed) { bridgedParams->binc = goParams.binc; } 156 | if (goParams.movetime != GoParam_TimeInterval_NotUsed) { bridgedParams->movetime = goParams.movetime; } 157 | if (goParams.movestogo != GoParam_Integer_NotUsed) { bridgedParams->movestogo = goParams.movestogo; } 158 | if (goParams.depth != GoParam_Integer_NotUsed) { bridgedParams->depth = goParams.depth; } 159 | if (goParams.nodes != GoParam_Integer_NotUsed) { bridgedParams->nodes = goParams.nodes; } 160 | 161 | // GoParam_Integer_NotUsed 162 | self.leela->CmdGo(*bridgedParams); 163 | } 164 | 165 | @end 166 | 167 | @implementation LCZero_EngineBridge (CPPProperties) 168 | 169 | -(void)setLeela:(lczero::LeelaConnect *)newLeela { 170 | @synchronized(self) { 171 | delete _leela; // it's OK to delete a NULL pointer 172 | _leela = newLeela; 173 | } 174 | } 175 | 176 | -(lczero::LeelaConnect *)leela { 177 | return _leela; 178 | } 179 | 180 | @end 181 | -------------------------------------------------------------------------------- /LeelaChessZero/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | $(CURRENT_PROJECT_VERSION) 21 | 22 | 23 | -------------------------------------------------------------------------------- /LeelaChessZero/LeelaChessZero.h: -------------------------------------------------------------------------------- 1 | /* 2 | This file is part of Leela Chess Zero. 3 | Copyright (C) 2018 The LCZero Authors 4 | 5 | Leela Chess is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU General Public License as published by 7 | the Free Software Foundation, either version 3 of the License, or 8 | (at your option) any later version. 9 | 10 | Leela Chess is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU General Public License for more details. 14 | 15 | You should have received a copy of the GNU General Public License 16 | along with Leela Chess. If not, see . 17 | 18 | Additional permission under GNU GPL version 3 section 7 19 | 20 | If you modify this Program, or any covered work, by linking or 21 | combining it with NVIDIA Corporation's libraries from the NVIDIA CUDA 22 | Toolkit and the NVIDIA CUDA Deep Neural Network library (or a 23 | modified version of those libraries), containing parts covered by the 24 | terms of the respective license agreement, the licensors of this 25 | Program grant you additional permission to convey the resulting work. 26 | */ 27 | 28 | #import 29 | 30 | //! Project version number for LeelaChessZero. 31 | FOUNDATION_EXPORT double LeelaChessZeroVersionNumber; 32 | 33 | //! Project version string for LeelaChessZero. 34 | FOUNDATION_EXPORT const unsigned char LeelaChessZeroVersionString[]; 35 | 36 | // In this header, you should import all the public headers of your framework using statements like 37 | #import 38 | 39 | 40 | -------------------------------------------------------------------------------- /LeelaChessZero/LeelaConnect.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | This file is part of Leela Chess Zero. 3 | Copyright (C) 2018 The LCZero Authors 4 | 5 | Leela Chess is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU General Public License as published by 7 | the Free Software Foundation, either version 3 of the License, or 8 | (at your option) any later version. 9 | 10 | Leela Chess is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU General Public License for more details. 14 | 15 | You should have received a copy of the GNU General Public License 16 | along with Leela Chess. If not, see . 17 | 18 | Additional permission under GNU GPL version 3 section 7 19 | 20 | If you modify this Program, or any covered work, by linking or 21 | combining it with NVIDIA Corporation's libraries from the NVIDIA CUDA 22 | Toolkit and the NVIDIA CUDA Deep Neural Network library (or a 23 | modified version of those libraries), containing parts covered by the 24 | terms of the respective license agreement, the licensors of this 25 | Program grant you additional permission to convey the resulting work. 26 | */ 27 | 28 | #include "LeelaConnect.hpp" 29 | #include 30 | #include 31 | #include 32 | 33 | #include "mcts/search.h" 34 | #include "utils/configfile.h" 35 | #include "utils/logging.h" 36 | 37 | namespace lczero { 38 | 39 | LeelaConnect::LeelaConnect() 40 | : bestMoveInfo(Move{}), engine_(std::bind(&LeelaConnect::BestMoveCallback, this, std::placeholders::_1), 41 | std::bind(&LeelaConnect::InfoCallback, this, std::placeholders::_1), 42 | options_.GetOptionsDict()) { 43 | engine_.PopulateOptions(&options_); 44 | // TODO: Some TECHDEBT, logging 45 | // options_.Add(kLogFileId); 46 | } 47 | 48 | void LeelaConnect::SetupWeights(const std::string& weightsFilePath) { 49 | if (!ConfigFile::Init(&options_) || !options_.ProcessAllFlags()) return; 50 | options_.GetMutableOptions()->Set(NetworkFactory::kWeightsId.GetId(), weightsFilePath); 51 | // Logging::Get().SetFilename(options_.GetOptionsDict().Get(foo)); 52 | } 53 | 54 | // Here are the move callbacks 55 | 56 | void LeelaConnect::BestMoveCallback(const BestMoveInfo& move) { 57 | 58 | // This string processing is only for logging 59 | std::string res = "bestmove " + move.bestmove.as_string(); 60 | if (move.ponder) res += " ponder " + move.ponder.as_string(); 61 | if (move.player != -1) res += " player " + std::to_string(move.player); 62 | if (move.game_id != -1) res += " gameid " + std::to_string(move.game_id); 63 | if (move.is_black) 64 | res += " side " + std::string(*move.is_black ? "black" : "white"); 65 | SendResponse(res); 66 | 67 | // Send the best move back up the chain 68 | bestMoveInfo = move; 69 | if (bestMoveBlock) 70 | bestMoveBlock(); 71 | } 72 | 73 | void LeelaConnect::InfoCallback(const std::vector& infos) { 74 | std::vector reses; 75 | 76 | // This string processing is only for logging 77 | for (const auto& info : infos) { 78 | std::string res = "info"; 79 | if (info.player != -1) res += " player " + std::to_string(info.player); 80 | if (info.game_id != -1) res += " gameid " + std::to_string(info.game_id); 81 | if (info.is_black) 82 | res += " side " + std::string(*info.is_black ? "black" : "white"); 83 | if (info.depth >= 0) res += " depth " + std::to_string(info.depth); 84 | if (info.seldepth >= 0) res += " seldepth " + std::to_string(info.seldepth); 85 | if (info.time >= 0) res += " time " + std::to_string(info.time); 86 | if (info.nodes >= 0) res += " nodes " + std::to_string(info.nodes); 87 | if (info.score) res += " score cp " + std::to_string(*info.score); 88 | if (info.hashfull >= 0) res += " hashfull " + std::to_string(info.hashfull); 89 | if (info.nps >= 0) res += " nps " + std::to_string(info.nps); 90 | if (info.tb_hits >= 0) res += " tbhits " + std::to_string(info.tb_hits); 91 | if (info.multipv >= 0) res += " multipv " + std::to_string(info.multipv); 92 | 93 | if (!info.pv.empty()) { 94 | res += " pv"; 95 | for (const auto& move : info.pv) res += " " + move.as_string(); 96 | } 97 | if (!info.comment.empty()) res += " string " + info.comment; 98 | reses.push_back(std::move(res)); 99 | } 100 | SendResponses(reses); 101 | 102 | // Send our raw responses up the chain. 103 | thinkingInfos = infos; 104 | if (thoughtBlock) 105 | thoughtBlock(); 106 | } 107 | // Here are the engine command helpers 108 | 109 | void LeelaConnect::CmdUci() { 110 | SendId(); 111 | for (const auto& option : options_.ListOptionsUci()) { 112 | SendResponse(option); 113 | } 114 | SendResponse("uciok"); 115 | } 116 | 117 | void LeelaConnect::CmdIsReady() { 118 | engine_.EnsureReady(); 119 | SendResponse("readyok"); 120 | } 121 | 122 | void LeelaConnect::CmdSetOption(const std::string& name, const std::string& value, 123 | const std::string& context) { 124 | options_.SetUciOption(name, value, context); 125 | // Set the log filename for the case it was set in UCI option. 126 | // TODO: logging 127 | // Logging::Get().SetFilename(options_.GetOptionsDict().Get(kLogFileId.GetId())); 128 | } 129 | 130 | void LeelaConnect::CmdUciNewGame() { engine_.NewGame(); } 131 | 132 | void LeelaConnect::CmdPosition(const std::string& position, 133 | const std::vector& moves) { 134 | std::string fen = position; 135 | if (fen.empty()) fen = ChessBoard::kStartposFen; 136 | engine_.SetPosition(fen, moves); 137 | } 138 | 139 | void LeelaConnect::CmdGo(const GoParams& params) { engine_.Go(params); } 140 | 141 | void LeelaConnect::CmdPonderHit() { engine_.PonderHit(); } 142 | 143 | void LeelaConnect::CmdStop() { engine_.Stop(); } 144 | 145 | void LeelaConnect::setBestMoveBlock(dispatch_block_t completion) { 146 | bestMoveBlock = dispatch_block_create(DISPATCH_BLOCK_DETACHED, completion); 147 | } 148 | 149 | void LeelaConnect::setThoughtBlock(dispatch_block_t completion) { 150 | thoughtBlock = dispatch_block_create(DISPATCH_BLOCK_DETACHED, completion); 151 | } 152 | 153 | } // namespace lczero 154 | 155 | -------------------------------------------------------------------------------- /LeelaChessZero/LeelaConnect.hpp: -------------------------------------------------------------------------------- 1 | /* 2 | This file is part of Leela Chess Zero. 3 | Copyright (C) 2018 The LCZero Authors 4 | 5 | Leela Chess is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU General Public License as published by 7 | the Free Software Foundation, either version 3 of the License, or 8 | (at your option) any later version. 9 | 10 | Leela Chess is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU General Public License for more details. 14 | 15 | You should have received a copy of the GNU General Public License 16 | along with Leela Chess. If not, see . 17 | 18 | Additional permission under GNU GPL version 3 section 7 19 | 20 | If you modify this Program, or any covered work, by linking or 21 | combining it with NVIDIA Corporation's libraries from the NVIDIA CUDA 22 | Toolkit and the NVIDIA CUDA Deep Neural Network library (or a 23 | modified version of those libraries), containing parts covered by the 24 | terms of the respective license agreement, the licensors of this 25 | Program grant you additional permission to convey the resulting work. 26 | */ 27 | 28 | #pragma once 29 | 30 | #ifndef LeelaConnect_hpp 31 | #define LeelaConnect_hpp 32 | 33 | #include 34 | #include 35 | #include 36 | #include "engine.h" 37 | #include "chess/uciloop.h" 38 | #include "mcts/search.h" 39 | #include "neural/cache.h" 40 | #include "neural/factory.h" 41 | #include "neural/network.h" 42 | #include "syzygy/syzygy.h" 43 | #include "utils/mutex.h" 44 | #include "utils/optional.h" 45 | #include "utils/optionsparser.h" 46 | 47 | namespace lczero { 48 | 49 | class LeelaConnect : public UciLoop { 50 | public: 51 | LeelaConnect(); 52 | 53 | // We expose these vars because our block callbacks are parameterless. 54 | // Therefore they may get stale, they should only be used within the callbacks they are meant for. 55 | std::vector thinkingInfos; 56 | BestMoveInfo bestMoveInfo; 57 | 58 | void setBestMoveBlock(dispatch_block_t completion); 59 | void setThoughtBlock(dispatch_block_t completion); 60 | 61 | // Note we intentionally don't override the runloop, we are a library and the runloop should be implemented in the app's architechture. 62 | // void RunLoop() override; 63 | 64 | void SetupWeights(const std::string& weightsFilePath); 65 | void CmdUci() override; 66 | void CmdIsReady() override; 67 | void CmdSetOption(const std::string& name, const std::string& value, 68 | const std::string& context) override; 69 | void CmdUciNewGame() override; 70 | void CmdPosition(const std::string& position, 71 | const std::vector& moves) override; 72 | void CmdGo(const GoParams& params) override; 73 | void CmdPonderHit() override; 74 | void CmdStop() override; 75 | 76 | private: 77 | void BestMoveCallback(const BestMoveInfo& move); 78 | void InfoCallback(const std::vector& infos); 79 | dispatch_block_t thoughtBlock; 80 | dispatch_block_t bestMoveBlock; 81 | OptionsParser options_; 82 | EngineController engine_; 83 | }; 84 | 85 | } // namespace lczero 86 | 87 | #endif /* LeelaConnect_hpp */ 88 | -------------------------------------------------------------------------------- /LeelaChessZero/LeelaSwift.swift: -------------------------------------------------------------------------------- 1 | /* 2 | This file is part of Leela Chess Zero. 3 | Copyright (C) 2018 The LCZero Authors 4 | 5 | Leela Chess is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU General Public License as published by 7 | the Free Software Foundation, either version 3 of the License, or 8 | (at your option) any later version. 9 | 10 | Leela Chess is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU General Public License for more details. 14 | 15 | You should have received a copy of the GNU General Public License 16 | along with Leela Chess. If not, see . 17 | 18 | Additional permission under GNU GPL version 3 section 7 19 | 20 | If you modify this Program, or any covered work, by linking or 21 | combining it with NVIDIA Corporation's libraries from the NVIDIA CUDA 22 | Toolkit and the NVIDIA CUDA Deep Neural Network library (or a 23 | modified version of those libraries), containing parts covered by the 24 | terms of the respective license agreement, the licensors of this 25 | Program grant you additional permission to convey the resulting work. 26 | */ 27 | 28 | import Foundation 29 | 30 | public protocol LeelaChessZeroDelegate: class { 31 | func leela(bestMove: LCZero_BestMoveInfo) 32 | func leela(thoughts: Array) 33 | } 34 | 35 | public enum lczero { 36 | public struct UCIGoParams { 37 | var wtime: TimeInterval? 38 | var btime: TimeInterval? 39 | var winc: TimeInterval? 40 | var binc: TimeInterval? 41 | var movestogo: Int? 42 | var depth: Int? 43 | var nodes: Int? 44 | var movetime: TimeInterval? 45 | var infinite = false 46 | var searchmoves: [String] = [] 47 | var ponder = false 48 | public init() {} 49 | } 50 | 51 | public enum UCICommand { 52 | case UCI 53 | case isReady 54 | case setOption(key: String, value: String, context: String) 55 | case newGame 56 | case position(fen: String, moves: [String]) 57 | case go(params: UCIGoParams) 58 | case ponderHit 59 | case stop 60 | } 61 | 62 | public class UCICommandEngine: NSObject { 63 | let leelaEngine: LCZero_EngineBridge = LCZero_EngineBridge() 64 | let delegate: LeelaChessZeroDelegate 65 | 66 | public required init(delegate: LeelaChessZeroDelegate) { 67 | self.delegate = delegate 68 | self.leelaEngine.bestMoveBlock = { (info: LCZero_BestMoveInfo) in 69 | delegate.leela(bestMove: info) 70 | } 71 | self.leelaEngine.thoughtBlock = { thoughts in 72 | guard let thoughts = thoughts as? Array else { 73 | fatalError("Formatting problem in the language tools") 74 | } 75 | delegate.leela(thoughts: thoughts) 76 | } 77 | } 78 | 79 | public func setupWeights(filePath: String) { 80 | leelaEngine.setupWeights(filePath) 81 | } 82 | 83 | public func sendCommand(_ command: UCICommand) { 84 | switch command { 85 | case .UCI: 86 | leelaEngine.sendUCI() 87 | break 88 | case .isReady: 89 | leelaEngine.sendIsReady() 90 | break 91 | case .setOption(let key, let value, let context): 92 | leelaEngine.sendSetOption(key, value: value, context: context); 93 | break 94 | case .newGame: 95 | leelaEngine.sendNewGame() 96 | break 97 | case .position(let fen, let moves): 98 | leelaEngine.sendPosition(fen, moves: moves) 99 | break 100 | case .go(let params): 101 | // Create an objective c param object to bridge the gap 102 | let goParams = LCZero_GoParameters.from(swiftParams: params) 103 | leelaEngine.sendGo(goParams) 104 | break 105 | case .ponderHit: 106 | leelaEngine.sendPonderHit() 107 | break 108 | case .stop: 109 | leelaEngine.sendStop() 110 | break 111 | } 112 | } 113 | } 114 | } 115 | 116 | extension LCZero_GoParameters { 117 | static func from(swiftParams: lczero.UCIGoParams) -> LCZero_GoParameters { 118 | let params = LCZero_GoParameters() 119 | params.infinite = swiftParams.infinite 120 | params.ponder = swiftParams.ponder 121 | params.wtime = swiftParams.wtime ?? TimeInterval(GoParam_TimeInterval_NotUsed) 122 | params.btime = swiftParams.btime ?? TimeInterval(GoParam_TimeInterval_NotUsed) 123 | params.winc = swiftParams.winc ?? TimeInterval(GoParam_TimeInterval_NotUsed) 124 | params.binc = swiftParams.binc ?? TimeInterval(GoParam_TimeInterval_NotUsed) 125 | params.movestogo = swiftParams.movestogo ?? Int(GoParam_Integer_NotUsed) 126 | params.depth = swiftParams.depth ?? Int(GoParam_Integer_NotUsed) 127 | params.nodes = swiftParams.nodes ?? Int(GoParam_Integer_NotUsed) 128 | return params 129 | } 130 | } 131 | 132 | -------------------------------------------------------------------------------- /LeelaChessZeroTests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | 22 | 23 | -------------------------------------------------------------------------------- /LeelaChessZeroTests/LeelaChessZeroTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // LeelaChessZeroTests.swift 3 | // LeelaChessZeroTests 4 | // 5 | // Created by Douglas Pedley on 1/2/19. 6 | // Copyright © 2019 d0. All rights reserved. 7 | // 8 | 9 | import XCTest 10 | @testable import LeelaChessZero 11 | 12 | class LeelaChessZeroTests: XCTestCase { 13 | 14 | override func setUp() { 15 | // Put setup code here. This method is called before the invocation of each test method in the class. 16 | } 17 | 18 | override func tearDown() { 19 | // Put teardown code here. This method is called after the invocation of each test method in the class. 20 | } 21 | 22 | func testExample() { 23 | // This is an example of a functional test case. 24 | // Use XCTAssert and related functions to verify your tests produce the correct results. 25 | } 26 | 27 | func testPerformanceExample() { 28 | // This is an example of a performance test case. 29 | self.measure { 30 | // Put the code you want to measure the time of here. 31 | } 32 | } 33 | 34 | } 35 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Leela Chess Zero swift framework for iOS 2 | 3 | A framework built for iOS to allow use of LeelaChessZero (lc0) chess engine. 4 | 5 | See the project [lczero.org](https://lczero.org) code here: [GITHUB](https://github.com/LeelaChessZero/) 6 | 7 | The majority of the work needed here was crossing the languange boundaries. 8 | 9 | * Leela is in C++, so I used `uciloop.cc` as a template for binding to lc0 callbacks called `LeelaConnect`. 10 | * C++ doesn't play nice with Objective-C, so I used Objective-C++ as the pass through language. `EngineBridge.mm` 11 | * `LeelaSwift.swift` uses the EngineBridge gives a delegate interface for communication. 12 | 13 | How it works. 14 | 15 | This repo uses `lc0` as a submodule, make sure to recurse the submodules so you have all the code needed. This will place the `lc0` code where the `Xcode` project expects it. 16 | 17 | * There were 2 changes to the `lc0` and `lczero-commons`. They are in `lc0-ios.diff` and `lczero-common-ios.diff`. You can apply them by running these command from the project root directory. 18 | ``` 19 | pushd submodules/lc0/libs/lczero-common; git apply ../../../../lczero-common-ios.diff; popd 20 | pushd submodules/lc0; git apply ../../lc0-ios.diff; popd 21 | ``` 22 | * You'll have to trigger the generation of the proto/net.pb.cc, proto/net.pb.cc the script `build_proto.sh` 23 | 24 | 25 | The other libraries that this framework rely on are `libz` and `libprotobuf-lite` 26 | 27 | * libz is included with iOS, just go to your app target -> build phases -> link with libraries and find `libz.tbd` 28 | * libprotobuf is a bit involved to build. My tip is to compile and install the mac libraries first so you can use the `protoc` built on the mac during the [cross compile](https://github.com/protocolbuffers/protobuf/blob/master/src/README.md). 29 | 30 | My protobuf configure (after installing the Mac built protobuf first) 31 | ``` 32 | ./configure --with-sysroot=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk --with-protoc=/usr/local/bin/protoc --disable-shared --enable-static --host=arm-apple-darwin 33 | ``` 34 | 35 | Assuming that all goes well, you should be able to open `LeelaChessZero.xcodeproj` and build LeelaChessZero.framework. 36 | 37 | Here's a snippet to use Leela via the framework: 38 | ``` 39 | class TestLeela: LeelaChessZeroDelegate { 40 | var leelaEngine: lczero.UCICommandEngine? 41 | 42 | public init(weightsFile: String) { 43 | self.init() 44 | self.leelaEngine = lczero.UCICommandEngine(delegate: self) 45 | leelaEngine?.setupWeights(filePath: weightsFile) 46 | } 47 | 48 | func evaluatePosition(fen: String, moves: [String]) { 49 | self.leelaEngine?.sendCommand(.position(fen: fen, moves: moves)) 50 | let params: lczero.UCIGoParams = lczero.UCIGoParams() 51 | self.leelaEngine?.sendCommand(.go(params: params)) 52 | } 53 | 54 | public func leela(bestMove: LCZero_BestMoveInfo) { 55 | print("Best Move: \(bestMove)") 56 | } 57 | 58 | public func leela(thoughts: Array) { 59 | print("Thoughts: \(thoughts)") 60 | } 61 | } 62 | 63 | // Elsewhere in the app: 64 | let testLeela = TestLeela(weightsFile: filePath) 65 | testLeela.evaluatePosition("6r1/5k2/5p2/p2P1N1R/2Ppp3/1P6/4K3/4b2r w - - 7 50", []) 66 | ``` 67 | -------------------------------------------------------------------------------- /build_proto.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | mkdir -p generated 4 | pushd submodules/lc0/libs/lczero-common/; protoc proto/net.proto --cpp_out ../../../../generated; popd 5 | -------------------------------------------------------------------------------- /lc0-ios.diff: -------------------------------------------------------------------------------- 1 | diff --git a/src/mcts/params.cc b/src/mcts/params.cc 2 | index 85dcb5f..2a2dea0 100644 3 | --- a/src/mcts/params.cc 4 | +++ b/src/mcts/params.cc 5 | @@ -34,7 +34,7 @@ FillEmptyHistory EncodeHistoryFill(std::string history_fill) { 6 | if (history_fill == "fen_only") return FillEmptyHistory::FEN_ONLY; 7 | if (history_fill == "always") return FillEmptyHistory::ALWAYS; 8 | assert(history_fill == "no"); 9 | - return FillEmptyHistory::NO; 10 | + return FillEmptyHistory::NEVER; 11 | } 12 | 13 | } // namespace 14 | diff --git a/src/neural/encoder.cc b/src/neural/encoder.cc 15 | index 77e9a51..7a5f52c 100644 16 | --- a/src/neural/encoder.cc 17 | +++ b/src/neural/encoder.cc 18 | @@ -64,7 +64,7 @@ InputPlanes EncodePositionForNN(const PositionHistory& history, 19 | history.GetPositionAt(history_idx < 0 ? 0 : history_idx); 20 | const ChessBoard& board = 21 | flip ? position.GetThemBoard() : position.GetBoard(); 22 | - if (history_idx < 0 && fill_empty_history == FillEmptyHistory::NO) break; 23 | + if (history_idx < 0 && fill_empty_history == FillEmptyHistory::NEVER) break; 24 | // Board may be flipped so compare with position.GetBoard(). 25 | if (history_idx < 0 && fill_empty_history == FillEmptyHistory::FEN_ONLY && 26 | position.GetBoard() == ChessBoard::kStartposBoard) { 27 | diff --git a/src/neural/encoder.h b/src/neural/encoder.h 28 | index 19669a2..971af2e 100644 29 | --- a/src/neural/encoder.h 30 | +++ b/src/neural/encoder.h 31 | @@ -32,7 +32,7 @@ 32 | 33 | namespace lczero { 34 | 35 | -enum class FillEmptyHistory {NO, FEN_ONLY, ALWAYS}; 36 | +enum class FillEmptyHistory {NEVER, FEN_ONLY, ALWAYS}; 37 | 38 | // Encodes the last position in history for the neural network request. 39 | InputPlanes EncodePositionForNN(const PositionHistory& history, 40 | diff --git a/src/utils/weights_adapter.cc b/src/utils/weights_adapter.cc 41 | index ea54fa3..9e50e26 100644 42 | --- a/src/utils/weights_adapter.cc 43 | +++ b/src/utils/weights_adapter.cc 44 | @@ -25,7 +25,7 @@ 45 | Program grant you additional permission to convey the resulting work. 46 | */ 47 | 48 | -#include "src/utils/weights_adapter.h" 49 | +#include "utils/weights_adapter.h" 50 | 51 | namespace lczero { 52 | float LayerAdapter::Iterator::ExtractValue(const uint16_t* ptr, 53 | @@ -49,4 +49,4 @@ float LayerAdapter::Iterator::operator[](size_t idx) const { 54 | return ExtractValue(data_ + idx, adapter_); 55 | } 56 | 57 | -} // namespace lczero 58 | \ No newline at end of file 59 | +} // namespace lczero 60 | -------------------------------------------------------------------------------- /lczero-common-ios.diff: -------------------------------------------------------------------------------- 1 | diff --git a/proto/net.proto b/proto/net.proto 2 | index 6f0e9e9..bbd0189 100644 3 | --- a/proto/net.proto 4 | +++ b/proto/net.proto 5 | @@ -28,6 +28,8 @@ syntax = "proto2"; 6 | 7 | package pblczero; 8 | 9 | +option optimize_for = LITE_RUNTIME; 10 | + 11 | message EngineVersion { 12 | optional uint32 major = 1; 13 | optional uint32 minor = 2; 14 | --------------------------------------------------------------------------------