DJProject_備忘録_8

## 2025-01-14
(続き)
#### あとやることは…
・ballスケジュール「make_x」を仮定
・InitAiTypesPlayerの実装（🔺）
・InitAiTypesPlayerをmake_xに追加
・ChangeAiModePlayerの実装（✅）
・ChangeAiModePlayerをmake_xに追加…しない（トグルスイッチでかつデフォルトがTrainの為）（✅）
・ChangeTravelModePlayerの実装（✅）
・ChangeTravelModePlayerをmake_xに追加しない（トグルスイッチでかつデフォルトがForwardの為）（✅）
・AiSettingsPlayerの実装
・AiSettingsPlayerを見ながら、TokenizerPlayerを作る。
・AiSettingsPlayerをmake_xに追加
・EmbeddingPlayerの実装
・EmbeddingPlayerをmake_xに追加
#### 実装中のつぶやき

## 2025-01-18
やること
#### あとやることは…
・ballスケジュール「make_x」を仮定
・InitAiTypesPlayerの実装（🔺）
・InitAiTypesPlayerをmake_xに追加
・ChangeAiModePlayerの実装（✅）
・ChangeAiModePlayerをmake_xに追加…しない（トグルスイッチでかつデフォルトがTrainの為）（✅）
・ChangeTravelModePlayerの実装（✅）
・ChangeTravelModePlayerをmake_xに追加しない（トグルスイッチでかつデフォルトがForwardの為）（✅）
・AiSettingsPlayerの実装(✅)
・AiSettingsPlayerを見ながら、TokenizerPlayerを作る。(✅)
・AiSettingsPlayerをmake_xに追加(✅)
・EmbeddingPlayerの実装(✅)
・EmbeddingPlayerをmake_xに追加(✅)
・BallOfjectの、ScheduleOfScheduleに、「モードの分岐処理は、各々プレイヤー自体に実装してください。」と、冒頭に記入しておく。(✅)
・スケジュールモードのスケジュール(モード分岐)の実装(✅)
・そして、上記のスケジュール実装中で必要と認識し、仮定したプレイヤーの実装
・スケジュールの実装
___

…ちょっと待って、、、ScheduleOfScheduleでスケジュールモードを切り替えるより、スケジュールモードを切り替えるプレイヤーを作った方が良くない、、！？

わかった、ScheduleOfScheduleは
「このモードが終了した後に、このモードを実行する」
という概念のみにしよう。つまり、forやmodeのif分岐は、全てプレイヤーの方で実装すれば、ScheduleOfScheduleはものすごくスッキリしたものになる！！！(上記のやることリストをそのように改変済み)



## 2025-01-23
#### あとやることは、、
・BallOfjectの、ScheduleOfScheduleに、「モードの分岐処理は、各々プレイヤー自体に実装してください。」と、冒頭に記入しておく。(✅)
・スケジュールモードのスケジュール(モード分岐)の実装(✅)
・そして、上記のスケジュール実装中で必要と認識し、仮定したプレイヤーの実装
・スケジュールの実装
___
モード切り替えのペア実装が完了した。↓
```

// 最初はロードから。
if ("FirstMode" == this.ScheduleMode)
{
    this.ScheduleMode = "ParamsLoadMode";
}
// Aiの推論設定
else if ("ParamsLoadMode" == this.ScheduleMode)
{
    this.ScheduleMode = "SettingsOfPredictMode";
}
// 入力データのベクトル化
else if ("SettingsOfPredictMode" == this.ScheduleMode)
{
    this.ScheduleMode = "ToVecOfXOfPredictMode";
}
// 推論を開始する
else if ("ToVecOfXOfPredictMode" == this.ScheduleMode)
{
    this.ScheduleMode = "OnePositionLoopOfPredictMode"; // eosトークンで抜ける
}
// 大臣と情報交換する(推論結果とサンプルデータのやり取り)
else if ("OnePositionLoopOfPredictMode" == this.ScheduleMode)
{
    this.ScheduleMode = "SNSWithDaijinMode"; // eosトークンで抜ける
}
// Aiの設定(訓練としての設定)
else if ("SNSWithDaijinMode" == this.ScheduleMode)
{
    this.ScheduleMode = "SettingsOfTrainMode";
}
// 入力データとラベルデータの、ベクトル化
else if ("SettingsOfTrainMode" == this.ScheduleMode)
{
    this.ScheduleMode = "ToVecOfXandTMode";
}
// 学習開始
else if ("ToVecOfXandTMode" == this.ScheduleMode)
{
    this.ScheduleMode = "OnePositionLoopOfTrainMode";
}
// パラメータのセーブ(セーブするしないの判断処理を含む)
else if ("OnePositionLoopOfTrainMode" == this.ScheduleMode)
{
    this.ScheduleMode = "ParamsSendToHomePCMode";
}
// 推論設定に戻る(ループする) ループだけどこっちが正規ルートの為実装。
else if ("ParamsSendToHomePCMode" == this.ScheduleMode)
{
    this.ScheduleMode = "SettingsOfPredictMode";
}

```
(ヤバっ、私の神的デザインパターンがバレるぅ💕)

未実装のモードの実装へ。
#### 未実装のモード群
(実装次第チェック)
```
FirstMode(✅)
ParamsLoadMode()
SettingsOfPredictMode
ToVecOfXOfPredictMode
OnePositionLoopOfPredictMode
SNSWithDaijinMode
SettingsOfTrainMode
ToVecOfXandTMode
OnePositionLoopOfTrainMode
ParamsSendToHomePCMode
```


## 2025-01-23
やることリスト
``` モードの実装
FirstMode(✅)
ParamsLoadMode
→ これは内部で(
class BitEncoderDecoderPlayer（仮)
    def FlattenAndEncodeToBits
    def UnpackFromBitArray
)の実装が必要()
SettingsOfPredictMode
ToVecOfXOfPredictMode
OnePositionLoopOfPredictMode
SNSWithDaijinMode
SettingsOfTrainMode
ToVecOfXandTMode
OnePositionLoopOfTrainMode
ParamsSendToHomePCMode
```
スケジュールの実装()
___

InstallFromParams2DcodePlayer
は、
- エンコード(1行25bitの行列でデータを作る)プレイヤーを実行
- AiSettingsPlayerに渡す
の2つだけかな？

→でも、エンコード、デコードはプレイヤーでまとめたいよ…


## 2025-01-25～
試行錯誤中(https://chatgpt.com/g/g-kuufVcS5H-miraitoriko/c/67939986-7220-8012-b7d0-a4ca3710fff0)
・モードのスケジュールが完了
・仮定義したスケジュールの実装
・仮定義したプレイヤーの実装
・_BitEncoderDecoderPlayerの実装中
・

チェックリスト
```
[✅] FirstMode
[✅] ParamsLoadMode
[✅]_BitEncoderDecoderPlayer
 [✅]FlattenAndEncodeToBits メソッド
 [✅]UnpackFromBitArray メソッド
 ▷(https://chatgpt.com/g/g-kuufVcS5H-miraitoriko/c/6797df6c-8aac-8012-abea-3abf2bef8dfe)
 ▷ BitEncoderDecoderPlayerは、全てのパラメータを、ひとつの1次元ジャグにまとめて出力するメソッド、またその1次元ジャグをデコードロードするメソッドを持たせました。
 なので、2Dcodeデータ ⇔ モデルParams のやり取りができるプレイヤーです。
[✅]OptimizerPlayerの実装
[🔺]作られたParamsのBit配列を、2Dcodeの限界容量毎にスプリットした2次元リストの作成(エンコード)するメソッド、それをデコードするメソッドを持った、新しいBitArraySplitterPlayerの実装
 ▷ 2Dコードの限界容量を取ってこよう（⚠️手間と判断。デバッグ時に実装する。）
[✅] // 二次元Bit配列からひとつ取り出すPlayerの実装
[] t_QRCodeErrorCorrectionAndMaskPlayerDir は多分使ってないですね、、。明確に使っていないことを確認する
[✅] // 二次元Bit配列にデータが無くなり次第(先頭のデータがnullになり次第)、次のモードを設定するPlayer の、実装(プレイヤーじゃないかも。)
[✅] // 二次元ジャグ化したら、各行の先頭にインデックスを加える(paddingSize=3 #100<1000枚程のテクスチャ使うから。) の実装
[✅]そのプレイヤーでエンコードされたデータを、forで回して沢山の2Dcodeを生産する形に、Modeを作り直し。
[✅] 二次元ジャグ化したら、各行の先頭にindexを追加する機能をどうにか入れる(BitArraySplitterPlayerに機能を追加する形にしよう。)
[✅] ParamsToBitDataModeのプレイヤー群のMainの再確認
[🔺]学習結果を今回保存するしないの判断をプレイヤーでやり、モード分岐をする。(保存するしないの条件だけ未実装)(ParamsSaveFlagControllingPlayerとして実装中…)

[✅]プレイヤー同士のクラス変数の渡し合いの実装
(
ParamsToBitDataMode(encode時、入力される二次元ジャグのindexがバラバラでも対応できるように改良もした)(✅)
BitDataTo2DcodeMode(
BitArrayFirstToEndHandlerPlayer(✅)
ChecksumPlayer(
ExtractedDataはstring型にしてこのプレイヤーに処理させなくちゃ。このプレイヤーでやる。関数を作った。
) (✅)
QRCodeMapInitializerPlayer (✅)
QRCodePositionDetectionPlayer (✅)
QRCodeTimingPatternPlayer (✅)
QRCodeAlignmentPatternPlayer (✅)
QRCodeMarkingPlayer （
あれっ、引き継ぎがへん、確認開始
QRCodeMarkingPlayer の変数の取得は次の通りに書かれている。

```
// 前のプレイヤーからデータを取得
ModeCharNumInfoChecksumBitlist = QRCodeAlignmentPatternPlayer.ModeCharNumInfoChecksumBitlist;
Version = QRCodeAlignmentPatternPlayer.Version;
 GridSize = QRCodeAlignmentPatternPlayer.GridSize;
QRCodeMap = QRCodeAlignmentPatternPlayer.QRCodeMap;
```
全ての変数は、1つ前のプレイヤーである「QRCodeAlignmentPatternPlayer」から取得しているようだ。
全ての変数しっかり存在しているか確認しよう。
？QRCo･･･ernPlayerに存在？
ModeCharNumInfoChecksumBitlist（❌）
Version（❌）→versionは存在
GridSize（❌）→ gridSizeは存在
QRCodeMap（❌）→ qrCodeMapは存在
# 修正に取り掛かる
ModeCharNumInfoChecksumBitlist（❌）
→これは厄介ね。過去の自分のまとめ方を思い出しながらいこう。
現在、
・データ
・QRCodeMap
のふたつを作成中。ModeCh･･･Bitlistは後者と思われる。
ChecksumPlayer にこの同じ名前の変数がある！
Version（✅）
gridSize（✅）
qrCodeMap（✅）
）(✅)
WriteMainDataPatternPlayer (✅)
QRCodeMaskApplicatorPlayer (✅)
QRCodeErrorCorrectionAndMaskPlayer (🔺（多分入力変数不要）)
QRCodeFormatInfoInserterPlayer (✅)
QRCodeTextureManagerPlayer(🦌)
)

[✅] ParamsToBitDataMode は、一次元ジャグ化するためのモード、とスケジュールにはメモされているけれど、本当に？確かめる。ParamsToBitDataModeで実行されている内容は…(
InitFromQrcodePlayer(AllParamsを一次元ジャグ化)(✅)
ParamsSaveFlagControllingPlayer(全開セーブ時刻から時間経過した時 かつ左大臣がワールドに存在した時に🚩を立てる)(🔺)
QRCodeModePlayer(モードを数字に変えるだけ)(✅)
QRCodeCharacterCountPlayer(CalculateBitCount() が
"0010" (英数字モード) → 9ビット、、
などの初期化設定。具体的にモードごとのビット数を決定して、指定された長さでゼロ埋めしたビット列を生成。最終的には、
モード指示子と文字数ビット列を結合して、最終的なビット出力を 
outputBits に格納。設定と最初のbitの用意だけなので、問題は無し)(✅)
QRCodeBitConversionPlayer(データをbitに変換するプレイヤー)(✅)
BitArraySplitterPlayer (QRの最大容量ごとにスプリットし、二次元ジャグ化しているプレイヤー)(✅)
)

[✅] Alphanumericモードは、
「
0 1 2 3 4 5 6 7 8 9  
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z  
スペース $ % * + - . / :  
」
しか変換ができないのだそう。なので、BitEncoderDecoderPlayer内では、アライメントをすべて「スペース $ % * / :  」のどれかにする様な改良が必要。修正した。README.mdにも「tokenizerにはalphabet飲みを使用してください」と記した。

[✅]あれ？AllParamsは二次元ジャグ。QRにするための一次元ジャグ化はどこ？(BitEncoderDecoderPlayerだ。でもこのプレイヤーはスケジュール内には存在させずに、ライブラリとして利用した気がする…使用している箇所を突き止める▷使っていなかった。BitEncoderDecoderPlayerをどうにか実装する。)(エンコードメソッドをInitFromQrcodePlayerResetのメインメソッドに実装した。)

[✅]思い返すと、重みやバイアスのなにか保存する時、文字列とfloat混ぜた気がするから、確認と修正(encode時にはstr化、Decode時には元に戻していたから問題なし)

### モードの作成と必要なプレイヤーの実装
▶︎モードスケジュールを上から見ていきます。（[✅]スケジュールを整理しました。）

[✅]YoutubeQRsChangeToArray2DMode ▷⚠️"ball"にスケジュールを作っていこう、つまりプレイヤーは仮定物。メモした紙を見ながらスケジュール
// YouTubeの必要画面を
// 全てスクリーンショットし、
// それからQRを全てデコードし、
// Array2Dに変換するまで。
// 「YoutubeQRsChangeToArray2DMode」
// [仮]init_YoutubeQRChangeToArray2DModePlayer // QRcodeの数を元にスクリーンショット1枚あたりの全てのQRの座標をリスト化, スクリーンショットの最大枚数は何枚なのか、を、メンバ変数として持たせる
// [仮]YoutubeScreenShotsPlayer // 最大枚数集まるまでスクリーンショットする(既に集まっていればパス)
// [仮]ScreenShootSelectingPlayer // 自分が処理すべきスクリーンショットを選択する
// [仮]QRcodeSelectingPlayer // 自分が処理すべきQRcodeを抜き取り選択する
// CentralSquareReaderPlayer // 抜き取ったQR含有テクスチャからQR部分を取り出す。(この時点でまだQRの台形歪みは未処理)
// TrapezoidCorrectionPlayer // QR コードの台形歪みを補正し、25x25 の正方形マトリックスにリサイズするプレイヤー。
// PatternDetectionPlayer // QR コードの画像を取得し、それを 25x25 のバイナリマトリックスに変換して、主要なパターン（位置検出パターン、タイミングパターン、ダークモジュール）が正しく存在するかを検出するプレイヤー。
// ReplacePatternPlayer // QR コードの 2D マトリックスにおける主要なパターン（位置検出パターン、タイミングパターン、ダークモジュールを特定の値（-11）で置き換えるプレイヤー。
// ColumnSplitterConcatPlayer // QR コードの 2D マトリックスに対して特定の処理を行い、新しいジャグ配列を作成するプレイヤー。
// RightBottomReaderPlayer // QRコードデータの2Dリストを解析し、右下からデータを抽出して1Dリストとして取得するプレイヤー。
// BitDataProcessorPlayer // QRコードや画像データから取得したビットデータを処理し、8ビットごとに分割する役割を持つプレイヤー。
// ChecksumCheekPlayer // ChecksumCheekPlayer は、QRコードのデータ処理後にチェックサムの整合性を確認するプレイヤー。
// SpiritBitDataPlayer // QRコードのデータ部分を解析し、モードや文字数情報を取得するプレイヤー。
// BitModeDataReconstructorPlayer // QRコードのビットモードデータを復元するプレイヤー。
//  [仮] WaitressQRDataWritingSchedulerPlayer  // 復元したデータをウェイトレスの帳簿に書き込み、次のユーザーに(ウェイトレスがいなければ、ウェイトレスが来るまで "Complete" を返さず、待機。さらに、全てのQRの読み込みが終わったことがウェイトレスから告げられたら、"Completed"とし、読み込み完了とする。
)

☆SNSBy1byteFromTexturePlayerTypesの作成
[✅] SNSBy1byteFromTexturePlayerTypes(
[✅] init_SNSBy1byteFromTexturePlayerTypesPlayer
[✅] EncodePush_a_IntToTexturesPlayer
[✅] PullDecode_a_TexturesToIntPlayer
)


## 2025-02-19〜
[🦌] YoutubeQRsChangeToArray2DModeのクラス変数の受け渡し受け取りの確認と、未実装プレイヤーの実装(
[🔺(まだ分かんないので)] init_YoutubeReaderPlayer
[🔺(YouTubeオブジェクトがまだ仮定義)] YoutubeScreenShotsPlayer // 最大枚数集まるまでスクリーンショットする(既に集まっていればパス)(

QR数は1枚あたり352個とする。
)
[✅] ScreenShootSelectingPlayer // 自分が処理すべきスクリーンショットを選択する
(ScreenShootSelectingPlayerを実装中ですSNSWithWaitressPlayerに、予め352個のQR座標を求めておくメソッドの実装を施した。
今(2025-03-01)はExecuteMainメソッドを作ってる。に、あたって、いま「処理中のスクショ内の全てが正常に読み込まれた場合trueを返すメソッド」を求めているところ
組み込み完了！(2025-03-06)
)
[✅] UpdateIAmWaitressPlayer // 先にウェイトレスの状態を、Updateする。
(じゃないと各プレイヤーでチマチマUpdateする羽目になり、どこでアップデートしたか忘れるだろうから
)る（
[✅] QRcodeSelectingPlayer // 自分が処理すべきQRcode座標を🌙から選択するプレイヤー
[✅] QRPixelExtractorPlayer // 定めたQR座標から、QRピクセルデータ部分の2次元ピクセルデータをクラス変数に取得するプレイヤー
(
今、読み込むスクショの横のピクセル数的な、1QRあたりのピクセル的なピッチ幅を取得するにあたって、
SNSWITHWAITRESSPLAYERを調整してCol,RowPitchの算出メソッドを調整した。
)
[✅] CentralSquareReaderPlayer // 抜き取ったQR含有テクスチャからQR部分を取り出す。(この時点でまだQRの台形歪みは未処理)
[✅] TrapezoidCorrectionPlayer // QR コードの台形歪みを補正し、25x25 の正方形マトリックスにリサイズするプレイヤー。
[✅] PatternDetectionPlayer // QR コードの画像を取得し、それを 25x25 のバイナリマトリックスに変換して、主要なパターン（位置検出パターン、タイミングパターン、ダークモジュール）が正しく存在するかを検出するプレイヤー。
[✅] ReplacePatternPlayer // QR コードの 2D マトリックスにおける主要なパターン（位置検出パターン、タイミングパターン、ダークモジュールを特定の値（-11）で置き換えるプレイヤー。
[✅] ColumnSplitterConcatPlayer // QR コードの 2D マトリックスに対して特定の処理を行い、新しいジャグ配列を作成するプレイヤー。
[✅] RightBottomReaderPlayer // QRコードデータの2Dリストを解析し、右下からデータを抽出して1Dリストとして取得するプレイヤー。
[✅] BitDataProcessorPlayer // QRコードや画像データから取得したビットデータを処理し、8ビットごとに分割する役割を持つプレイヤー。
[✅] ChecksumCheekPlayer // ChecksumCheekPlayer は、QRコードのデータ処理後にチェックサムの整合性を確認するプレイヤー。
[✅] SpiritBitDataPlayer // QRコードのデータ部分を解析し、モードや文字数情報を取得するプレイヤー。
[✅] BitModeDataReconstructorPlayer // QRコードのビットモードデータを復元するプレイヤー。
[] WaitressQRDataWritingSchedulerPlayer // 復元したデータをウェイトレスの帳簿に書き込み、次のユーザーに
(
ウェイトレスがいなければ、ウェイトレスが来るまで "Complete" を返さず、待機。さらに、全てのQRの読み込みが終わったことがウェイトレスから告げられたら、"Completed"とし、読み込み完了とする。
)
ウェイトレスを移動させる。
(
この実装過程により、iAmWaitress.ReadData(読んだQRの保存先)の初期化コードの未実装が発覚した。
どこかで、「ウェイトレスが目の前にいてかつ、自身がワールド内で最小のUIDだった場合に、初期化」を、実装してください。→CalculateAllQRXYs実行時で実装しよう(2025-03-28)。
)



[]SettingsOfPredictMode
▷ ParamsLoadModeの次に実行されるものですね。 Aiの推論設定です。
[]ToVecOfXOfPredictMode
[]OnePositionLoopOfPredictMode
[]SNSWithDaijinMode
[]SettingsOfTrainMode
[]ToVecOfXandTMode
[]OnePositionLoopOfTrainMode
[]ParamsSendToHomePCMode
[]プレイヤー同士のクラス変数の渡し合いの実装
[✅] ParamsToBitDataMode
▷パラメータをBit一次元化と、それをQRCodeサイズにスプリットして2次元化
[✅] BitDataTo2DcodeMode
▷2次元Bitパラメータを全てQRcodeテクスチャ化
[]

```