trianglengin 2.0.2__cp313-cp313-musllinux_1_2_i686.whl → 2.0.4__cp313-cp313-musllinux_1_2_i686.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -4,7 +4,7 @@
4
4
  #include "shape_logic.h"
5
5
  #include <stdexcept>
6
6
  #include <numeric>
7
- #include <iostream> // <--- Add iostream
7
+ #include <iostream> // Keep iostream if other debug logs might be added later, or remove if not needed
8
8
  #include <algorithm> // For std::min
9
9
 
10
10
  namespace trianglengin::cpp
@@ -41,8 +41,7 @@ namespace trianglengin::cpp
41
41
  if (!game_over_ && valid_actions_cache_ && valid_actions_cache_->empty())
42
42
  {
43
43
  force_game_over("No valid actions available at start.");
44
- // Log the reason for immediate game over
45
- std::cerr << "[GameStateCpp::check_initial_state_game_over] Forced game over: No valid actions at start." << std::endl;
44
+ // REMOVED C++ Log: std::cerr << "[GameStateCpp::check_initial_state_game_over] Forced game over: No valid actions at start." << std::endl;
46
45
  }
47
46
  }
48
47
 
@@ -218,8 +217,7 @@ namespace trianglengin::cpp
218
217
  if (!game_over_ && valid_actions_cache_->empty())
219
218
  {
220
219
  force_game_over("No valid actions available.");
221
- // Log the reason for game over after calculation
222
- std::cerr << "[GameStateCpp::get_valid_actions] Forced game over: No valid actions found after calculation." << std::endl;
220
+ // REMOVED C++ Log: std::cerr << "[GameStateCpp::get_valid_actions] Forced game over: No valid actions found after calculation." << std::endl;
223
221
  }
224
222
  return *valid_actions_cache_;
225
223
  }
@@ -235,8 +233,7 @@ namespace trianglengin::cpp
235
233
  if (game_over_)
236
234
  {
237
235
  valid_actions_cache_ = std::set<Action>();
238
- // Add logging for this case too
239
- std::cerr << "[GameStateCpp::calculate_valid_actions_internal] Game already over. Returning empty set." << std::endl;
236
+ // REMOVED C++ Log: std::cerr << "[GameStateCpp::calculate_valid_actions_internal] Game already over. Returning empty set." << std::endl;
240
237
  return;
241
238
  }
242
239
  std::set<Action> valid_actions;
@@ -260,19 +257,15 @@ namespace trianglengin::cpp
260
257
  valid_actions.insert(encode_action(shape_idx, r, c));
261
258
  can_place_true_count++; // Increment counter
262
259
  }
263
- // Optional: Log failed attempts if needed for deep debugging
264
- // else {
265
- // std::cerr << "[Debug] can_place failed for shape " << shape_idx << " at (" << r << "," << c << ")" << std::endl;
266
- // }
267
260
  }
268
261
  }
269
262
  }
270
- // Add logging here
271
- std::cerr << "[GameStateCpp::calculate_valid_actions_internal] Step: " << current_step_
272
- << ", Attempts: " << attempts_count
273
- << ", CanPlaceTrue: " << can_place_true_count
274
- << ", ValidActionsFound: " << valid_actions.size()
275
- << std::endl;
263
+ // REMOVED C++ Log:
264
+ // std::cerr << "[GameStateCpp::calculate_valid_actions_internal] Step: " << current_step_
265
+ // << ", Attempts: " << attempts_count
266
+ // << ", CanPlaceTrue: " << can_place_true_count
267
+ // << ", ValidActionsFound: " << valid_actions.size()
268
+ // << std::endl;
276
269
 
277
270
  // Use mutable cache
278
271
  valid_actions_cache_ = std::move(valid_actions);
@@ -8,6 +8,7 @@ import numpy as np
8
8
  from .config import EnvConfig
9
9
 
10
10
  try:
11
+ # Keep the alias for clarity within this file
11
12
  import trianglengin.trianglengin_cpp as cpp_module
12
13
  except ImportError as e:
13
14
  raise ImportError(
@@ -127,6 +128,19 @@ class GameState:
127
128
  # C++ returns double, cast might be redundant but safe for mypy
128
129
  return cast("float", self._cpp_state.get_score())
129
130
 
131
+ def get_outcome(self) -> float:
132
+ """
133
+ Returns the final outcome of the game if it's over, otherwise 0.0.
134
+ Required by MCTS implementations like trimcts.
135
+ """
136
+ if self.is_over():
137
+ # In this game, the final score is the outcome.
138
+ # Adjust if a different outcome definition is needed (e.g., +1 win, -1 loss).
139
+ return self.game_score()
140
+ else:
141
+ # MCTS typically expects 0 for non-terminal states during simulation.
142
+ return 0.0
143
+
130
144
  def valid_actions(self, force_recalculate: bool = False) -> set[int]:
131
145
  """
132
146
  Returns a set of valid encoded action indices for the current state.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: trianglengin
3
- Version: 2.0.2
3
+ Version: 2.0.4
4
4
  Summary: High-performance C++/Python engine for a triangle puzzle game.
5
5
  Author-email: "Luis Guilherme P. M." <lgpelin92@gmail.com>
6
6
  License-Expression: MIT
@@ -40,7 +40,7 @@ Dynamic: license-file
40
40
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
41
41
  [![Python Version](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/downloads/)
42
42
 
43
- # Triangle Engine (`trianglengin`) v2
43
+ # Triangle Engine (`trianglengin`) v2.0.3
44
44
  <img src="bitmap.png" alt="trianglengin logo" width="300"/>
45
45
 
46
46
  **Version 2 introduces a high-performance C++ core for the game logic.**
@@ -78,7 +78,7 @@ The primary goal is to provide a self-contained, installable library with a high
78
78
 
79
79
  ```bash
80
80
  # For standard use (once published or built):
81
- pip install trianglengin
81
+ pip install trianglengin>=2.0.3
82
82
 
83
83
  # Building from source (requires compiler and CMake):
84
84
  git clone https://github.com/lguibr/trianglengin.git
@@ -233,7 +233,7 @@ trianglengin/
233
233
  ## Core Components (v2)
234
234
 
235
235
  - **`trianglengin.cpp` (C++ Core)**: Implements the high-performance game logic (state, grid, shapes, rules). Not directly imported in Python.
236
- - **`trianglengin.game_interface.GameState` (Python Wrapper)**: The primary Python class for interacting with the game engine. It holds a reference to the C++ game state object and provides methods like `step`, `reset`, `is_over`, `valid_actions`, `get_shapes`, `get_grid_data_np`.
236
+ - **`trianglengin.game_interface.GameState` (Python Wrapper)**: The primary Python class for interacting with the game engine. It holds a reference to the C++ game state object and provides methods like `step`, `reset`, `is_over`, `valid_actions`, `get_shapes`, `get_grid_data_np`, **`get_outcome`**.
237
237
  - **`trianglengin.config.EnvConfig`**: Python Pydantic model for core environment configuration. Passed to C++ core during initialization.
238
238
  - **`trianglengin.utils`**: General Python utility functions and types. ([`src/trianglengin/utils/README.md`](src/trianglengin/utils/README.md))
239
239
 
@@ -1,21 +1,21 @@
1
1
  trianglengin.libs/libgcc_s-f3fb5a36.so.1,sha256=SrjjCCuY7RHj-T9JLrY9XFMgCCpYD9Qmezr4uoJGVEQ,168321
2
2
  trianglengin.libs/libstdc++-d2a021ba.so.6.0.32,sha256=1zr_iwGwEBe95gyKdgiw7C4Y1RR9ijV40j66rk4elzg,3537349
3
- trianglengin-2.0.2.dist-info/WHEEL,sha256=9n53zz4ALaO6U1YAVkD5NGZRmqwzjBdx_d8qungefuc,110
4
- trianglengin-2.0.2.dist-info/RECORD,,
5
- trianglengin-2.0.2.dist-info/top_level.txt,sha256=YsSWmp_2zM23wRc5TRERHpVCgQuVYieYHDTpnwVQC7Y,13
6
- trianglengin-2.0.2.dist-info/entry_points.txt,sha256=kQEqO_U-MEpMEC0xwOPSucBzQIq2Ny7XwCtFSruZhvY,57
7
- trianglengin-2.0.2.dist-info/METADATA,sha256=Io9O5zLlg5f3wzujuWaJaZWqkVP_6XyOQbj7xtDoiNw,12036
8
- trianglengin-2.0.2.dist-info/licenses/LICENSE,sha256=So3rgoJp-HgoxkclxZLIBC3pmmTwshN4tUO8KiQ6akc,1077
9
- trianglengin/trianglengin_cpp.cpython-37m-i386-linux-gnu.so,sha256=zrwcqsIcPbqjVwhv_B0ratwwNIZIPIT0piykSvlp9_I,310085
10
- trianglengin/trianglengin_cpp.cpython-313-i386-linux-musl.so,sha256=zrwcqsIcPbqjVwhv_B0ratwwNIZIPIT0piykSvlp9_I,310085
11
- trianglengin/game_interface.py,sha256=0aCePxmhLJOdlPGHU_JOuu-lsBZVfOs0vK5eke-bxv0,8730
3
+ trianglengin-2.0.4.dist-info/WHEEL,sha256=9n53zz4ALaO6U1YAVkD5NGZRmqwzjBdx_d8qungefuc,110
4
+ trianglengin-2.0.4.dist-info/RECORD,,
5
+ trianglengin-2.0.4.dist-info/top_level.txt,sha256=YsSWmp_2zM23wRc5TRERHpVCgQuVYieYHDTpnwVQC7Y,13
6
+ trianglengin-2.0.4.dist-info/entry_points.txt,sha256=kQEqO_U-MEpMEC0xwOPSucBzQIq2Ny7XwCtFSruZhvY,57
7
+ trianglengin-2.0.4.dist-info/METADATA,sha256=Ep7c5ldlwGwB_JhzXsgAWju0AHq4k5144Z5dzqmmR6Q,12066
8
+ trianglengin-2.0.4.dist-info/licenses/LICENSE,sha256=So3rgoJp-HgoxkclxZLIBC3pmmTwshN4tUO8KiQ6akc,1077
9
+ trianglengin/trianglengin_cpp.cpython-37m-i386-linux-gnu.so,sha256=qegst4rVmNItDATC7mRkXDR7stYLUtu0HwLaPUeQwNU,309753
10
+ trianglengin/trianglengin_cpp.cpython-313-i386-linux-musl.so,sha256=qegst4rVmNItDATC7mRkXDR7stYLUtu0HwLaPUeQwNU,309753
11
+ trianglengin/game_interface.py,sha256=ijfBH08DU2sHyMH6XZmQbFQZDPGsKlkk3gk3AUt3fmU,9304
12
12
  trianglengin/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
13
13
  trianglengin/__init__.py,sha256=4INnGvOYIjzOyCew7lhX6Irc8_H7QVxWc5jopt9TCZ4,919
14
14
  trianglengin/config/README.md,sha256=PKm6HMVMZkA1KB22s2lP-jh5jwB7XIDiFgoShz_xj0s,1506
15
15
  trianglengin/config/env_config.py,sha256=IMjbOrAZxgVzLjod9tmFhv964E30paG4zI1eUS8Nvy8,2359
16
16
  trianglengin/config/display_config.py,sha256=FHY9iKuuk7L5h-xWtDTthHUlvyme4AJeA5kOk-zZJFg,1815
17
17
  trianglengin/config/__init__.py,sha256=wKb-lRhguEAJCxcPHG1qyW-AmUherzMbUfi3SZ6IEao,160
18
- trianglengin/cpp/game_state.cpp,sha256=WRYA_alYDZs2zR7NU1LMnZ9reKF8YvXGzF7KubQU0ys,12333
18
+ trianglengin/cpp/game_state.cpp,sha256=PL_YUf_3S8yOSfFpICr9zuq5Y_9j3gthaQZ4Th5jA5E,12090
19
19
  trianglengin/cpp/structs.h,sha256=v_aL5O5gwXH_qRPGUIkNplr167rgf7gCVlWIJKOLV1U,993
20
20
  trianglengin/cpp/grid_data.cpp,sha256=KH9BbLuhi-_fmKgnT2oPuzHRDo87xFDHiBfpXCwgYsw,6904
21
21
  trianglengin/cpp/grid_logic.h,sha256=O6roOE_U7nbKgAkaMkC8LrEjGDvnL3QiVzOnXunXy9s,781