├── .gitignore
├── .gitmodules
├── LeelaChessZero.xcodeproj
├── project.xcworkspace
│ ├── contents.xcworkspacedata
│ └── xcshareddata
│ │ └── IDEWorkspaceChecks.plist
└── project.pbxproj
├── lczero-common-ios.diff
├── LeelaChessZeroTests
├── Info.plist
└── LeelaChessZeroTests.swift
├── LeelaChessZero
├── Info.plist
├── LeelaChessZero.h
├── EngineBridge.h
├── BridgingObjects.mm
├── BridgingObjects.h
├── LeelaConnect.hpp
├── LeelaSwift.swift
├── LeelaConnect.cpp
└── EngineBridge.mm
├── lc0-ios.diff
└── README.md
/.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.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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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/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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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/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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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/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.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 |
--------------------------------------------------------------------------------