Commit Graph

91 Commits

Author SHA1 Message Date
timotree3
eb623454d7 Add /replays/ to gitignore for local use 2023-01-19 23:30:38 -05:00
timotree3
e040cdedc6 Update json_ouput for latest site 2023-01-19 21:51:09 -05:00
timotree3
a1bfa76b77 Merge branch 'rust-2021' into json_output_2021 2023-01-19 21:44:15 -05:00
timotree3
1a42a4dd21 Run cargo fmt 2023-01-19 21:22:16 -05:00
timotree3
bed45135d5 Use variables directly in format expressions (Clippy lint) 2023-01-19 21:05:32 -05:00
timotree3
ae4f671740 Clean up boolean logic 2023-01-19 21:02:44 -05:00
timotree3
91fc4c279d Clean up formatting code 2023-01-19 21:02:43 -05:00
timotree3
d65b7616f1 Fix clippy warnings 2023-01-19 20:59:20 -05:00
timotree3
b8a82294d1 Update to 2021 edition 2023-01-19 20:55:47 -05:00
timotree3
2b866ac227 Add specific versions for dependencies 2023-01-19 20:34:17 -05:00
timotree3
4bab09ba2b Run cargo fmt 2023-01-19 20:31:32 -05:00
phimuemue
c9b21fa047
Compile on rust 1.61, resolve warnings, fix some lints (#12)
* Fix getopts version

The pinned version does not compile anymore because of mutable aliasing:
* https://github.com/rust-lang/getopts/pull/61
* https://github.com/rust-lang/getopts/issues/110

This was achieved by temporarily setting the getopts version to "0.2.21"
in Cargo.toml, and running `cargo check`.

Note that this also converts the Cargo.lock to a new format.

* Fix warning: Instead of deprecated macro try!, use question mark operator

* Fix warning: Avoid anonymous parameters

* Fix warning: Use dyn on trait objects

* Fix warning: Avoid unneeded mutability

* Fix warning: Avoid redundant format in panic or assert

* Fix lint: Avoid redundant field names in initializers

* Fix lint: Avoid redundant clone

* Fix lint: Avoid literal cast

* Fix lint: Collapse if/else where applicable

I left some if/else branches in place, if there was a certain symmetry between the branches.

* Fix lint: Avoid needless borrow

I left some if/else branches in place, if there was a certain symmetry between the branches.

* Fix lint: Use cloned instead of custom closure

* Fix lint: Avoid unneeded trait bound

* Fix lint: Avoid unneeded trait bound (2) avoid redundant clone

* Fix lint: Use &[T] instead of &Vec<T>

* Fix lint: Avoid & on each pattern

* Fix lint: Avoid manual assign

* Fix lint: Use implicit return

* Fix lint: Merge if/else branches with same value

I left one complicated branch in place.

* Fix lint: Use is_empty instead of comparing len against 0

* Fix lint: Use sum instead of fold

* Fix lint: Avoid clone on Copy types
2022-07-05 11:05:13 -07:00
Jeff Wu
cf65b0e158 updates for FAIR work 2019-12-09 10:12:31 -08:00
Jeff Wu
b8ea5d4ad5
bragging 2019-05-26 23:59:42 -07:00
Felix Bauckholt
ade33395c2 Add option to only generate outputs for lost games 2019-03-22 13:44:32 +01:00
Felix Bauckholt
180d8c5f4e Second attempt at outputting JSON for hanabi.live
We don't support any notes yet.

Inside our GameState, we annotate each card with its index in the
original (reverse) deck. In order to support per-card notes, we should
probably share those annotations with the players, and refactor the
player code around them.
2019-03-22 03:50:01 +01:00
Felix Bauckholt
7f384cc15d
Merge pull request #7 from felixbauckholt/information-efficiency
Refactoring to be able to improve information efficiency
2019-03-20 02:35:57 +01:00
Felix Bauckholt
1c229227ab Merge branch 'master' into information-efficiency 2019-03-15 14:23:09 +01:00
Felix Bauckholt
9364a06862 Improve ask_question strategy
I also replaced the callback architecture behind
`PublicInformation.ask_questions()` with a simpler method
`PublicInformation.ask_question()` that gets called repeatedly.

To make all float-based sorts easier, I used the `float-ord` package.
I also used it to clean up some of the sorting in `decide_wrapped()`.
2019-03-15 13:45:17 +01:00
Jeff Wu
c791adcb5a make readme slightly nicer 2019-03-10 22:31:20 -07:00
Felix Bauckholt
8fd230da1c Report standard errors in README.md 2019-03-10 22:20:25 -07:00
Felix Bauckholt
051ac7a097 Modulus magic!
Suppose we have `total_information` choices, and we first use them to
encode the answer `x` to a question with `m` answers. That answer is encoded
by the choice we take modulo `m`.

How much "information" do we have left? That depends on the number of
numbers less than `total_information` that are equal to `x` modulo `m`.
Depending on the value of `x`, this is either
`floor(total_information/m)` or `floor(total_information/m) + 1`.

We now use all of this information as opposed to just
`floor(total_information/m)`, at the cost of making our math not a lot
more complicated but pretty confusing.
2019-03-07 22:48:14 +01:00
Felix Bauckholt
8ed01d47ca Slight changes to be more information-efficient
- If a player discards because nobody else needed a hint, that
  information is "transmitted" before they transmit other info through
  hat stuff.
- The "card possibility partition" questions now take into account info
  learned through earlier questions.
2019-03-07 22:29:20 +01:00
Felix Bauckholt
493631dad0 Refactor out a "public information object"
One important change is that now, when deciding which questions to ask, they can see the answer to the last question before asking the next one.

Some design choices:
- Questions now take a BoardState instead of an OwnedGameView.
- When deciding which questions to ask (in ask_questions), we get an immutable public information object
  (representing the public information before any questions were asked), and a mutable HandInfo<CardPossibilityTable>
  that gets updated as we ask questions. That HandInfo<CardPossibilityTable> was copied instead of taken.
- In ask_questions, we also get some &mut u32 representing "info_remaining" that gets updated for us.
  This will later allow for cases where "info_remaining" depends on the answers to previous questions.
- Both get_hint_sum and update_from_hint_sum change the public information object. If you want to compute the
  hint sum but aren't sure if you actually want to give the hint, you'll have to clone the public information
  object!
- Over time, in the code to decide on a move, we'll be able to build an increasingly complicated tree of
  "public information object operations" that will have to be matched exactly in the code to update on a move.
  In order to make this less scary, I moved most of the code into
  "decide_wrapped" and "update_wrapped". If the call to update_wrapped
  (for the player who just made the move) changes the public information
  object in different ways than the previous call to decide_wrapped, we
  detect this and panic.

This commit should be purely refactoring; all changes to win-rates are
due to bugs.
2019-03-07 22:04:06 +01:00
Felix Bauckholt
e510f7cc5e Switch around ordering of question combining
This has the advantage that for some ModulusInformation object m and
some modulus,

```
a = m.split(modulus);
m.cast_down(x);
```

is equivalent to

```
m.cast_down(x*modulus);
a = m.split(modulus);
```

This means that when using a ModulusInformation object to answer
questions, we can answer the first question without needing to know how
many questions there are.
2019-03-07 21:52:33 +01:00
Felix Bauckholt
96da95dbba Oops I had accidentally left bogus numbers in the last commit
Sorry :(
2019-03-07 21:38:55 +01:00
Felix Bauckholt
92aa0e703a
Merge pull request #9 from felixbauckholt/determinism
Determinism
2019-03-07 20:56:05 +01:00
Felix Bauckholt
8337c61ea2 Auto-update README.md with cargo run --release -- --write-results-table 2019-03-07 19:12:31 +01:00
Felix Bauckholt
ef860fa73b Make runs reproducible by replacing HashMaps with FnvHashMaps 2019-03-07 13:54:30 +01:00
Felix Bauckholt
e04d242a71 Bug fixes 2019-03-06 12:23:21 +01:00
Felix Bauckholt
5540d1c4c6 Add helper method knows_playable_card 2019-02-27 13:20:59 +01:00
Felix Bauckholt
35502541a2 If a player discards because nobody needed a hint, make that common knowledge
"Needing a hint" is defined as having a playable card, but not knowing
any specific card is playable. Thus, if a player doesn't know any
playable cards and someone else discards, the player (publicly)
concludes that all their cards are unplayable.
2019-02-26 22:51:04 -08:00
Felix Bauckholt
7ace892f40 Make better decisions between hinting and discarding
I think most of the gains of this change come from the fact
that now we don't discard any potentially useful cards if we have more
than 4 hints remaining.
2019-02-26 22:51:04 -08:00
Felix Bauckholt
b3a8209b74 Slight refactoring
- Remove some duplication in InformationPlayerStrategy::decide()
- Add method GameView::get_other_players()
2019-02-26 22:51:04 -08:00
Felix Bauckholt
385feeb6ba Slight tweaks that increase 3-player win rate to 75%
- When there are less than 5 players, and we're near the discard threshold, prefer
  hinting over discarding, even if there are known useless cards.

- We now ask questions like "what's the first playable card in this list?"

  This means that if a playable card is in the asking player's list,
  the player will learn that it's playable, and that every card before
  it is not playable.

  Additionally, if a player doesn't know of any dead cards in their hand
  and there is enough information available, we use this mechanism so that
  if the player doesn't have a playable card, they will learn about one
  dead card in their hand.

(These were two commits that got joined in a rebase accident, sorry.)
2019-02-21 10:19:54 -08:00
Jeff Wu
737085948e compiled with new rustc 2018-03-24 09:36:25 -07:00
Jeff Wu
bd3824dc7d
Fix broken table 2018-03-23 19:29:59 -07:00
Jeff Wu
9214006ccb Merge pull request #2 from tjhance/use-4-hints-per-player
in some situations, allow 4 possible hints for some players
2016-06-22 08:17:52 -07:00
Travis Hance
0e5f34275e in some situations, allow 4 possible hints for some players rather than just 3
In particular, do this when for a player when it is public knowledge
that they have at least 2 distinct numbers and 2 distinct colos
2016-06-22 01:03:17 -07:00
Jeff Wu
cab576f883 minor cleanups 2016-04-04 00:49:10 -07:00
Jeff Wu
f2de390e0e moving stuff around
- add hand info
- don't manage info in game views
- prevent deck size cheat
- rearrange stuff
2016-04-04 00:07:11 -07:00
Jeff Wu
d86136889d only ask about playability when needed 2016-04-03 20:57:31 -07:00
Jeff Wu
678a8f26a7 seed deck in simulator, use iterators more 2016-04-02 17:51:25 -07:00
Jeff Wu
b19e6ff615 update readme 2016-04-02 14:56:40 -07:00
Jeff Wu
81427e2dd5 smart hinting, silencing/configuring of progress output 2016-04-02 13:51:18 -07:00
Jeff Wu
7f5e32699e various cleanups, fixes 2016-04-02 12:35:53 -07:00
Jeff Wu
ec1fd2eb07 make color = char 2016-03-31 10:36:13 -07:00
Jeff Wu
58c881130a fix sorting wrong order bug... some cleanup, update results 2016-03-31 09:37:50 -07:00
Jeff Wu
38bb323d91 more improve 2016-03-30 23:18:55 -07:00
Jeff Wu
0aad4dfa1c choose index dynamically, use OwnedGameView where possible 2016-03-30 10:28:15 -07:00