This file is indexed.

/usr/include/osl/ntesuki/ntesukiSearcher.h is in libosl-dev 0.8.0-1.4.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
/* ntesukiSearcher.h
 */
#ifndef _NTESUKI_SEACHER_H
#define _NTESUKI_SEACHER_H
#include "osl/state/numEffectState.h"
#include "osl/ntesuki/ntesukiTable.h"
#include "osl/ntesuki/ntesukiRecord.h"
#include "osl/ntesuki/ntesukiMoveGenerator.h"

#include "osl/ntesuki/ntesukiExceptions.h"
#include "osl/container/moveVector.h"
#include "osl/ntesuki/ntesukiSimulationSearcher.h"

#include <osl/stl/vector.h>

namespace osl
{
  namespace ntesuki
  {
    class
    NtesukiSearcher
    {
    public:
      typedef NumEffectState State;

    private:
      State& state;

      /** 手生成器. */
      NtesukiMoveGenerator *mg;
      
      /** トランスポジションテーブル. */
      NtesukiTable table;

      /** シミュレーション探索器. */
      NtesukiSimulationSearcher simulator;

      /** 現在までに何ノード読んだか. */
      unsigned int node_count;

      /** 最大何ノードまで読むか. */
      unsigned int read_node_limit;
      
      /** 経過をどこまで表示するか. */
      bool verbose;

      /** 探索を途中で強制的に終了させるための flag. */
      volatile int *stop_flag;

      /** ルートから現在探索中のノードまでの path の hash値. */
      PathEncoding path;

      /** ルートから現在探索中のノードまでの move. */
      typedef std::vector<Move> moves_t;
      moves_t moves_played;
      
      /** ルートから現在探索中のノードまでの局面. */
      typedef std::vector<NtesukiRecord *> nodes_t;
      nodes_t nodes_played;

      /** λオーダ */
      unsigned int max_pass;


    public:
      /**
       * 探索のふるまいを制御する変数.
       */
      static bool delay_non_pass;
      static bool ptt_invalid_defense;

      static bool delay_interpose;
      static bool delay_nopromote;
      static bool delay_non_attack;
      static bool read_attack_only;
      static bool ptt_non_attack;

      static bool ptt_siblings_fail;
      static bool ptt_siblings_success;

      static bool ptt_uncle;
      static bool ptt_aunt;

      static unsigned int dynamic_widening_width;

    private:
      /** Iterative widening の scheme */
      NtesukiRecord::IWScheme iwscheme;
      /** Player selection の scheme */
      NtesukiRecord::PSScheme psscheme;
      /** Inversion searching の scheme */
      NtesukiRecord::ISScheme isscheme;

      /** 詰めろな手に関する cost */
      int tsumero_cost;

      /** 詰めろな手に関する証明数の予測値 */
      int tsumero_estimate;

      /** GC の際にテーブル をどこまで小さくするか */
      double gc_ratio;

      template<class Search,Player T> class AttackHelper;
      template<class Search,Player T> class DefenseHelper;
      template<class Search,Player T> class CallSimulationAttack;
      template<class Search,Player T> class CallSimulationDefense;
      template<class Search,Player T> class CallSimulationDefenseDisproof;

      /* statistic information */
      unsigned int blockByAttackBack;
      unsigned int blockByPass;
      unsigned int attack_node_count;
      unsigned int attack_node_under_attack_count;
      unsigned int attack_node_moves_count;
      unsigned int defense_node_count;
      unsigned int defense_node_under_attack_count;
      unsigned int defense_node_moves_count;
      unsigned int pass_count, pass_success_count;
      unsigned int pass_attack_count, pass_attack_success_count;
      unsigned int sibling_defense_count, sibling_defense_success_count;
      unsigned int sibling_attack_count, sibling_attack_success_count;
      unsigned int isshogi_defense_count, isshogi_defense_success_count;
      unsigned int isshogi_attack_count, isshogi_attack_success_count;
      unsigned int immediate_win, immediate_lose;
      unsigned int attack_back_count;
      unsigned int proof_without_inversion_count, proof_AND_count, disproof_by_inversion_count;

    public:
      static const int NtesukiNotFound = -1;
      static const int ReadLimitReached = -2;
      static const int TableLimitReached = -3;
    private:
      static const unsigned int INITIAL_PROOF_LIMIT =
      ProofDisproof::PROOF_LIMIT / 4;
      static const unsigned int INITIAL_DISPROOF_LIMIT =
      ProofDisproof::DISPROOF_LIMIT / 4;

      /**
       * 攻撃側の処理
       */
      template <Player T>
      NtesukiResult attack(NtesukiRecord* record,
			   const NtesukiRecord* oracle_attack,
			   const NtesukiRecord* oracle_defense,
			   unsigned int proofLimit,
			   unsigned int disproofLimit,
			   int pass_left,
			   const Move last_move);
      template <Player T>
      void attackWithOrder(NtesukiRecord* record,
			   const NtesukiRecord* oracle_attack,
			   const NtesukiRecord* oracle_defense,
			   unsigned int proofLimit,
			   unsigned int disproofLimit,
			   int pass_left,
			   const Move last_move);

      template <Player T>
      NtesukiMove* selectMoveAttack(NtesukiRecord* record,
				    unsigned int& best_proof,
				    unsigned int& sum_disproof,
				    unsigned int& second_proof,
				    unsigned int& best_disproof,
				    unsigned int& step_cost,
				    NtesukiMoveList& moves,
				    const int pass_left);

      /**
       * 防御に関する計算
       */
      template <Player T>
      NtesukiResult defense(NtesukiRecord* record,
			    const NtesukiRecord* oracle_attack,
			    const NtesukiRecord* oracle_defense,
			    unsigned int proofLimit,
			    unsigned int disproofLimit,
			    int pass_left,
			    const Move last_move);


      template <Player T>
      void defenseWithPlayer(NtesukiRecord* record,
			     const NtesukiRecord* oracle_attack,
			     const NtesukiRecord* oracle_defense,
			     unsigned int proofLimit,
			     unsigned int disproofLimit,
			     int pass_left,
			     const Move last_move);

      template <Player T>
      NtesukiMove* selectMoveDefense(NtesukiRecord* record,
				     unsigned int& best_disproof,
				     unsigned int& sum_proof,
				     unsigned int& second_disproof,
				     unsigned int& best_proof,
				     unsigned int& step_cost,
				     NtesukiMoveList& moves,
				     const int pass_left,
				     const Move last_move);

      /**
       * 受け手番で,ある手が Success だとわかった場合,
       * 他の手も同様に Success にならないか Simulaition で調べる.
       * 現在 $\lambda^n$ 探索中の場合には,原則 $\lambda^(n-1)$ move の場合には調べない.
       *
       * e.g. 必至探索中には王手は調べない.
       */
      template <Player T> void simulateSiblingsSuccess(NtesukiRecord *record,
						       NtesukiRecord *record_best,
						       int pass_left,
						       unsigned int& success_count,
						       unsigned int& total_count);

      /**
       * 攻め手番で,ある手が Fail だとわかった場合,
       * 他の手も同様に Fail にならないか Simulaition で調べる.
       */
      template <Player T> void simulateSiblingsFail(NtesukiRecord *record,
						    NtesukiRecord *record_best,
						    int pass_left,
						    unsigned int& success_count,
						    unsigned int& total_count);
      /**
       * 攻めになっていない手を除く.
       */
      template <Player T> void handleNonAttack(NtesukiRecord *record,
					       int pass_left);
      /**
       * 頓死がないか調べる.
       */
      template <Player T> void handleTonshi(NtesukiRecord *record,
					    int pass_left,
					    const Move last_move);
      /**
       * 無駄合候補が本当に無駄合が調べる.
       */
      template <Player T> void handleInterpose(NtesukiRecord *record,
					       int pass_left);

    public:
      /* ======================
       * 外から呼ばれる関数
       */
      NtesukiSearcher(State& state,
		      NtesukiMoveGenerator *mg,
		      unsigned int table_limit,
		      volatile int *stop_flag,
		      bool verbose,
		      int maxPass = NtesukiRecord::SIZE,
		      NtesukiRecord::IWScheme iwscheme = NtesukiRecord::pn_iw,
		      NtesukiRecord::PSScheme psscheme = NtesukiRecord::no_ps,
		      NtesukiRecord::ISScheme isscheme = NtesukiRecord::no_is,
		      int tsumero_cost = 0,
		      int tsumero_estimate = 0,
		      double gc_ratio = 0.33);
      ~NtesukiSearcher();


      template <Player T> int search();

      int searchSlow(Player attacker, int rnl = 160000)
      {
	read_node_limit = rnl;
	if (attacker == BLACK)
	  return search<BLACK>();
	else
	  return search<WHITE>();
      }

      NtesukiTable& getTable();
      int getNodeCount() const { return node_count; }
      bool exceedReadNodeLimit() const {return node_count > read_node_limit;}

    };
  } //ntesuki
} //osl

#endif /* _NTESUKI_SEACHER_H */
// ;;; Local Variables:
// ;;; mode:c++
// ;;; c-basic-offset:2
// ;;; End: