ポコム version 8.19 readme.html

■重要な注意点■

pocom.hの移動

今まで #include "pocom.h" としていたのを pocom.h を移動したため #include "../pocom.h" とします。
そのためgcc,g++では -I. がコマンドラインに必要となりました。(2023/8/12)
.bashrc にexport C_INCLUDE_PATH=.export CPLUS_INCLUDE_PATH=.を加えると、-I.を省略できます。

FILE_NAME

計算ルーチンの1行目の
#define FILE_NAME "Example1.c"
に必ず計算ルーチンのファイル名そのものを書いてください。
例えば、計算ルーチンのファイルのコピーなどを行ったときに、
これがコピー元のファイル名のままだとコンパイルできないトラブルが起きます。

■構成■

Example\ ポコムの簡単な例題
Stat\ ポコムの高度な例題(幾つかの統計処理)
Mva\ 平均値解析
Tsp\ 巡回セールスマン問題
OptQ\ 開待ち行列網最適化
AvxOmp\ AVX と OpenMP のベンチマーク
tools\ コンパイル・ツール
ptools\ ポコム・ツール
intro.html ポコムの紹介
readme.html このファイル
pocom.h ポコム本体
pocom.html ポコム プログラマーズ ガイド
anneal.html annealプログラマーズ ガイド
anneal.h annealプログラム
memo.html メモ
$DoFirst.bat共通ファイルをコピーする

■インストール■

Windows では、まず最初に $DoFirst.bat を実行してください。 共通ファイルが必要なフォルダにコピーされます。

処理が終わりました

続行するには何かキーを押してください ...

でキーを押す前に端末のウィンドウのタイトルバーを右クリックして、 [プロパティ]を選びます。
[フォント]タブの[フォント(F)]で[MS ゴシック]を選びます。

拡張子が .tsv のファイルをエクセルに関連付けると、 シフトJISの .tsv ファイルをダブルクリックするだけで開くことができます。

エクセル2007以降でUTF8の .tsv ファイルを開くためには、 Windows7 以降では、スタートメニューの プログラムの一覧からエクセルを右クリックして「タスクバーにピン止めする」を 行っておくと便利です。 WindowsXP と WindowsVista では代わりに「クイック起動」にエクセルを追加します。
そうして、タスクバーからエクセルを起動して、.tsv ファイルを開けば、 正しく開くことができます。

C++コンパイラのインストール

とします。

■著作権、使用条件、再配布■

ドキュメント、ソースコードに関する著作権は、 ポコムの作者にあります。

このソフトを使用した結果生じた損害は保証しません。 また、バージョンアップ、サポートの義務も負いません。

このソフトはフリーソフトウェアです。無料で使うことができます。

計算ルーチン、および、その出力の権利は、それぞれを作成した人に属します。

■version 8.18 と version 8.19 との違い■

■version 8.17 と version 8.18 との違い■

■version 8.16 と version 8.17 との違い■

■version 8.15 と version 8.16 との違い■

■version 8.14 と version 8.15 との違い■

X86_INTRIN が有効の時 gcc 9 かそれ以降、または VisualC++2013 かそれ以降の 新しいコンパイラ場合、機械語ではなく組み込み関数で実現するようにしました。 これによって X86_INTRIN を定義しても Clang-Tidy 等によるコード分析が可能になりました。
ただし、NO_BUILTIN を定義すると、新しいコンパイラでも従来通りの機械語で実現します。
また、新しく RdtscpAux, MmPause1, HaveRdseed, Rand_s, Rand64_s を追加しました。
そして、32ビットでコンパイルしても Bsf64, Bsr64, Bswap64 が使用可能になりました。

■version 8.13 と version 8.14 との違い■

■version 8.12 と version 8.13 との違い■

■version 8.11 と version 8.12 との違い■

■version 8.10 と version 8.11 との違い■

■version 8.09 と version 8.10 との違い■

■version 8.08 と version 8.09 との違い■

■version 8.07 と version 8.08 との違い■

■version 8.06 と version 8.07 との違い■

■version 8.05 と version 8.06 との違い■

■version 8.04 と version 8.05 との違い■

■version 8.03 と version 8.04 との違い■

■version 8.02 と version 8.03 との違い■

■version 8.01 と version 8.02 との違い■

■version 7.06 と version 8.01 との違い■

■version 7.05 と version 7.06 との違い■

■version 7.04 と version 7.05 との違い■

■version 7.03 と version 7.04 との違い■

■version 7.02 と version 7.03 との違い■

■version 7.01 と version 7.02 との違い■

■version 6.05 と version 7.01 との違い■

■version 6.04 と version 6.05 との違い■

■version 6.03 と version 6.04 との違い■

■version 6.02 と version 6.03 との違い■

■version 6.01 と version 6.02 との違い■

■version 5.06 と version 6.01 との違い■

■version 5.05 と version 5.06 との違い■

■version 5.04 と version 5.05 との違い■

■version 5.03 と version 5.04 との違い■

■version 5.02 と version 5.03 との違い■

■version 5.01 と version 5.02 との違い■

MulAdd(n,mul,add) を追加しました。CheckIntOverflow(n,mul,add) の 代わりに使います。
Visual C++ 2019 に対応しました。
WINDOWS モードでエラーメッセージだけのログは確認なしにログを削除するようにしました。

■version 4.17 と version 5.01 との違い■

CSVファイルを入力ファイルとして受け付けるようにしました。 ,(カンマ)をクォートしていないデータファイルとの互換性を保つには、
#define NO_CSV_READ
のように定義して下さい。
Windows10 の罫線でケタずれが起こらなくなりました。

■version 4.16 と version 4.17 との違い■

version 4.03 の CHECK_ALLOC の機能を削除しました。 (pocom.h で空の配列を監視するよりも、デバッガを使ったほうが的確であるため)

■version 4.15 と version 4.16 との違い■

Print 関数で浮動小数点数を表示するときに ; を2つ指定することで一時的に16進数で出力できるようにしました。
PrintCsv、PrintTSV 関数で文字列・コード型を表示するときに ; を2つ指定することで一時的に引用符なしで出力できるようにしました。

■version 4.14 と version 4.15 との違い■

STRP, SVECP, SMATP, SJAGP, CDEFP, RandCounter, RandLastSeed, RandPosition を廃止しました。

■version 4.13 と version 4.14 との違い■

ポコム関数 Quit を追加しました。Windows9x での System の不具合を修正しました。

■version 4.12 と version 4.13 との違い■

NO_AUTO、NO_LAST、CHECK_CDEF、USE_CSVTSV_STR、SPACER6 を追加しました。Mk.bat を使いやすくしました。
(SPACER6 は version 6.03 で廃止しました。NO_AUTO と NO_LAST は version 6.05 で廃止しました。)

■version 4.11 と version 4.12 との違い■

ポコム関数 System を改良しました。

PrintCSV と PrintTSV が新元号「令和」に対応しました。

■version 4.10 と version 4.11 との違い■

ポコム関数 System を追加しました。

■version 4.09 と version 4.10 との違い■

" でクォートして開始した文字列の中で "" を入れると " 1文字になります。
' も同様に '' を入れると ' 1文字になります。

PrintCSV と PrintTSV を改良しました。

■version 4.08 と version 4.09 との違い■

NO_CSVTSV_STR の導入とPrintCSV と PrintTSV で文字列を出力するときにクォートする判定条件を変更しました。

■version 4.07 と version 4.08 との違い■

文字列変数の Format を負に指定すると、クォートしないようにしました。

■version 4.06 と version 4.07 との違い■

PrintCSV で " を出力するときに "" に変換するようにしました。

■version 4.05 と version 4.06 との違い■

PrintCSV と PrintTSV で文字列を出力するときにクォートする判定条件を変更しました。

■version 4.04 と version 4.05 との違い■

ファイルの終わりは空白行なしでデータ行の終わりとみなすようにしました。

■version 4.03 と version 4.04 との違い■

マクロ LIST を加えました。これによりパラメーターを指定せずに起動したり、 List コマンドを実行したときにバージョン情報なども出力できるようになりました。

■version 4.02 と version 4.03 との違い■

●CHECK_ALLOC の機能を追加しました。(その後 version 4.17 で削除しました)

●ポコム関数 Limit に負の値を指定して、Print で表示する横方向の文字数を 指定できるようになりました。
例えば80×24の端末ならば -79 とすると Print は条件を満たせば、79文字を超えようとすると折り返すようになります。 また Limit が負の場合は PrintCSV, や PrintTSV は16383セルで折り返すようになります。 折り返しを無効にするには、Limit 0 とします。
デフォルトは通常は -79 でウィンドウズモードでは -1024 です。 また、Limit を変更しても、Limit -1 のようにするとデフォルトに戻るようになります。

●version 4.02 で Ubuntu でコンパイルしたプログラムで、Windows の データファイルを読み込むとエラーが起きる不具合を直しました。

■version 4.01 と version 4.02 との違い■

●CHECK_MEM と CHECK_HEAP をより強力にしました。(CHECK_HEAP は version 6.01 で無効にしました)
・ZeroStr の書き換えによってポコムが混乱するのを防ぎました。
・ヒープの外の文字列を "(err)" としました。
・CHECK_MEM が有効の時 LSI_C が SetStr( ) 等で失敗するのを修正しました。

●配列の終わりに $ を置く代わりに空白行を置くようにしました。 読込と書き出しの両方がこの新ルールに従います。
以前のバージョンのデータファイルは殆ど読み込むことができますが、 データ行とデータ行の間に空白行があると読込が終了してしまい、 エラーとなります。データ行の中の空白行を注釈行にするか空白行を削除する必要があります。 プログラムの側で古いポコムのデータと互換性を保つには、 必要に応じて OLD_PRINT, OLD_PRINT3, OLD_READ, OLD_READ4 等を定義してください。

■version 3.04 と version 4.01 との違い■

●BYTE,BVEC,BMAT,BJAG, TINT,TVEC,TMAT,TJAG, NINT,NVEC,NMAT,NJAG, LINT,LVEC,LMAT,LJAG, FLT,FVEC,FMAT,FJAG, DBL,DVEC,DMAT,DJAG を追加しました。
32/64ビットではデフォルトで全て使用可能です。
16ビットでは NINT,NVEC,NMAT,NJAG はデフォルトで使用可能です。それ以外の新しい型は、 ASIF32 か USE_ALL_TYPES を定義すれば LINT,LVEC,LMAT,LJAG 以外の全てが使用可能です。
HALF,HVEC,HMAT,HJAG もC++コンパイラならばデフォルトで使用可能です。
また、個別に USE_BYTE,USE_TINT,USE_FLT,USE_DBL,USE_HALF を定義すると対応する型が使用可能になります。
half 型は半精度浮動小数点数でC++でコンパイルすれば、必要に応じて倍精度浮動小数点数と互いに変換することができます。 また、HALF_REAL を定義すれば REAL,RVEC,RMAT,RJAG を half 型にできます。

● 例えば C:\...> example1.exe -2.0 test.txt のようにコマンドラインからメモリの最大使用量を制限(この例では2ギガバイト)できるようになりました。

●StrDup( ) と GetMemStr( ) を廃止しました。

●32/64ビットでは CHECK_MEM, BACK_RAND, JUMP_RAND がデフォルトで有効になりました。
32/64ビットで NO_CHECK_MEM を定義することにより CHECK_MEM を無効にできます。

●CDEF_BASE と NO_CHECK_CDEF と UpdateCvar( ) を追加しました。

●浮動小数点数一様乱数の精度のビット数を 11, 24, 32, 53 から選べるようになりました。
また、乱数を使用した回数などを記録するようにしました。
ジャンプ用の浮動小数点数定数 TERA を追加しました。

●HaveCmdLineFile を追加しました。AUTO( ) で実行される関数の中で HaveCmdLineFile が true だとコマンドラインでファイルが指定されたことがわかります。

●CodeStr( )、CvecStr( )、CmatStr( )、CjagStr( ) を追加しました。

■version 3.03 と version 3.04 との違い■

●AllocStr()、AllocSvec()、AllocSmat()、AllocSjag() を追加しました。

●SetStr()、SetSvec()、SetSmat()、SetSjag() を追加しました。

●STRP、SVECP、SMATP、SJAGP を追加しました。(その後 version 4.15 で削除しました)

●ファイルを削除する Delete 関数を追加しました。

●データファイルで $ の前の ; を省略しないのを標準としました。古い形式で書き出すには OLD_PRINT を定義してください。

●Add 関数群と Reset 関数と Sort 関数を追加しました。

●固定長行列の列数を、常に0にできるようにしました。(ALLOW_MAT_0 を常に有効にしマクロの廃止)
また、固定長行列の列の入れ替えを SwapRow マクロ以外でできなくしました。(CONST_MAT を常に有効にしマクロの廃止)。

■version 3.02 と version 3.03 との違い■

●ウィンドウズモードを導入しました。

●Print、PrintCSV で表示変数名変更機能を追加しました。

●文字列処理を高速化しました。
(プログラムで文字列型変数の値を変更するときに GetMem() や StrDup() を使っている場合は修正が必要です。)

●X86_INTRIN を導入しました。詳しくは pocom.html を参照してください。

●TDM-GCC-64 に対応しました。

●Windows 版にUTF8モードを導入しました。

■version 3.01 と version 3.02 との違い■

●Limit で PrintCSV でも、出力幅を制限できるようになりました。

●一時 INTF を FIX と名前を変更しましたが、2016/5/13 に FIX(100) とすると、 INTF(FIX100,6,100,"FIX100") と宣言したと同じようになるように変更しました。

●0から始まる整数は、デフォルトで8進数ではなく10進数と見なすようにしました。
以前のように8進数と見なすには pocom.h をインクルードする前に #define ENABLE_OCTAL のように定義します。

●FILE_NAME と CHECK_FILE_NAME マクロを導入しました。
THIS_IS マクロの代わりに使います。THIS_IS マクロも引き続き使用できます。

●高速乱数を追加しました。

●pocom.h をインクルードする前に #define CUSTOM_MAIN のように定義をすることで、 自分で main 関数を書くことができるようになりました。

●CheckIntOverflow(n,mul,add) マクロを追加しました。

●pocom.h をインクルードする前に #define WINUTF8 のように定義をすることで、Windows でも、 Visual C++ 2010 sp1、2013 以降の Visual C++、または TDM-GCC-64 でUTF8のプログラムをコンパイル出来るようになりました。 他のコンパイラでもプログラムがASCII文字だけなら、WINUTF8 を定義すればUTF8のデータファイルを扱うこともできます。

●NO_ALIAS, NO_APPEND, NO_CDEF, NO_CLOCK, NO_CSV, NO_ECHO, NO_FORMAT, NO_FREE, NO_JAG, NO_LAP, NO_LIMIT, NO_LIST, NO_OUTPUT, NO_RAND, NO_RANGE, NO_SAVE, NO_ADJUST, NO_VMJ を追加しました。
これらを0以外に定義すると、対応する機能を削除してプログラムサイズが小さくなります。 NO_ALL を定義すれば、これら全てを定義したことになりプログラムがかなり小さくなります。
NO_ALL を定義しても、例えば -DNO_ALIAS=0 のように定義すれば NO_ALIAS だけ例外にできます。
これらのマクロを利用することで、メモリ制限のあるコンパイラで、 より大きなプログラムをコンパイルできる場合があります。

●pocom.html と memo.html を一つ上のフォルダに置くようにしました。

● JPN マクロを導入しました。pocom.h インクルードする前や、コンパイル時のコマンドラインで 定義をすると、今までどおりの日本語のエラーメッセージが表示されるようになります。 逆に指定しないと、今までとは違い、英語のエラーメッセージが表示されるようになります。 JPN マクロによって EJ("English","日本語") マクロでどちらかが選ばれるようになります。

●ポコム関数 Limit を導入しました。これは0個以上の単純変数と一つの配列を Print で表示するときに、 改行を使って横に並べる要素の数を制限します。

■version 2.02 と version 3.01 との違い■

●プログラムの先頭に #define THIS_IS "Example1.c" のように書くことで、 データ定義と計算ルーチンをまとめることができるようになりました。 以前のバージョンのような書き方でもそのまま受け入れるようにもなっています。 しかし、ドキュメントは新しい書き方に従って書き直しました。

●NoList を AUTO マクロで指定できなくなりました。
AUTO マクロで指定していたら、削除して、代わりに計算ルーチンで NoList=1; としてください。

●JUMP_RAND と BACK_RAND マクロを復活させました。
BackUnif,BackRand,BackUnif_r,BackRand_r を使用するなら pocom.h をインクルードする前に #define BACK_RAND としてください。
Jump,Jump_r を使用するなら pocom.h をインクルードする前に #define JUMP_RAND としてください。

●Int 型と Unsigned 型を道入しました。
INT,IVEC,IMAT,IJAG,CODE,CVEC,CMAT,CJAG の要素の型も Int 型にしました。
pocom.h をインクルードする前に #define INT_64 のように定義すれば、 Int を long long 型に、Unsigned を unsigned long long 型に切り替えることができるようになり、 64ビットでコンパイルした場合の性能が向上します。 また、16ビットのコンパイラで、 pocom.h をインクルードする前に #define INT_32 のように定義すれば、 Int を long 型に Unsigned を unsigned long 型に切り替えることができるようになりました。

これに伴い、文字列マクロ PRIz を用意しました。

#define PRIz ""    /* when Int == int       */
#define PRIz "ll"  /* when Int == long long */
#define PRIz "I64" /* when Int == __int64   */
#define PRIz "l"   /* when Int == long      */

INT_64 や INT_32 を指定した新機能を使用しないならば、 Int 型は int なので、計算ルーチンのソースコードは 変更する必要はありません。しかし、新機能に対しても移植性を保つには、計算ルーチンの int を 必要に応じて Int に書き換えたり、 printf、fprintf、sprintf を使っているなら、フォーマットに必要に応じて PRIz を埋め込む必要があります。 例えば計算ルーチンにいままで、

 INT(N,3,"問題の大きさ")
 { int i; for (i=0;i<N;i++) fprintf(fp,"# N=%d/%d\n",i,N); }
のように記述していた場合、
 { Int i; for (i=0;i<N;i++) fprintf(fp,"# N=%" PRIz "d/%" PRIz "d\n",i,N); }
あるいは、
 { Int i; for (i=0;i<N;i++) fprintf(fp,"# N=%.0f/%.0f\n",(real)i,(real)N); }
または、
 { Int i; for (i=0;i<N;i++) fprintf(fp,"# N=%d/%d\n",(int)i,(int)N); }

と書き換える必要があります。

●Range は一つの変数に対して一回だけしか設定できなくなりました。つまり Range の 解除と再設定を禁止しました。 理由は、計算ルーチンが暴走しないようにするために AUTO マクロなどで Range を設定したのに、 データファイルに Range 文を加えて暴走するデータファイルを簡単に作成できていたからです。

●INT 型の亜種 INTF 型(int fixed)を導入しました。INT 型の定数のように振る舞います。 今まで、

 INT(N,3,"大きさ")
 AUTO("N")
 AUTO("10")
 AUTO("Range N == 10")

としていたのを、まとめて

 INTF(N,3,10,"大きさ")

と書けるようになりました。

●GetMem() で一度に確保できるメモリの量を32ビットの場合1Gバイト未満、 64ビットの場合6Gバイト未満に制限しました。 これは、MEM_LIMIT マクロでGバイトを単位として変更できます。

●内部のメモリ確保の方法を改良しました
メモリ節約ルーチンが組み込まれました。例えば、

 INT(N,2,"行数")
 IVEC(Data,2,N,"データ")

とした時、

 Data
 1 2 3 4 5 6 7 8 9 10 $

とするよりも、

 N    Data
 10   1 2 3 4 5 6 7 8 9 10 $
Range N == 10
Data
1 2 3 4 5 6 7 8 9 10 $

のように、データのサイズをあらかじめ指定しておくと、 変数の内容は同じでも、 読み込みの時に、大きなデータの場合、かなり作業用のメモリを節約できます。しかし、

N
10
Data
1 2 3 4 5 6 7 8 9 10 $

のように、N の指定を同時に行わない場合は、メモリは節約されないことに注意してください。 pocom.h をインクルードする前に #define NO_SAVE のように定義すれば、 節約をする仕組みを組み込まなくなり、プログラムサイズが小さくなります。

■version 2.01 と version 2.02 との違い■

● UTF8の日本語でも桁がずれなくなりました。

● g++ での警告が出なくなりました。これに伴い、

 FUNC(Test,"Test")

 void Test(char*argument) {

のようにしていたら、

    void Test(const char*argument) {

のように const を加えるように書きなおしてください。

● pocom.h をインクルードする前に #define HIT_ENTER のように定義すれば、 実行が終了した時に [ENTER] キーの入力を待ちます。 gcc -DHIT_ENTER や cl /D HIT_ENTER のようにしても有効です。

● pocom.h をインクルードする前に #define CHECK_MEM のように定義すれば、 メモリの検査をします。 gcc -DCHECK_MEM や cl /D CHECK_MEM のようにしても有効です。 GetMem( ) と StrDup( ) と FreeMem( ) が正しく使われているかどうかがわかります。

● pocom.h をインクルードする前に #define FLOAT_REAL のように定義すれば、 real, rvec, rmat, rjag を float の typedef にすることができます。。 gcc -DFLOAT_REAL や cl /D FLOAT_REAL のようにしても有効です。 使用メモリをできるだけ節約したい時や、OpenCL、SSE、AVX などで速度を上げたいときに指定します。

● pocom.h をインクルードする前に #define ALIGN_MEM 8 のように 8 16 32 等に定義をすれば、 GetMem( ) の返すアドレスをアライメントできます。 gcc -DALIGN_MEM=8 や cl /D ALIGN_MEM=8 のようにしても有効です。 4 にすれば、16 bit コンパイラで FLOAT_REAL が設定されているときに浮動小数点演算が高速になります。
8 にすれば、16 bit コンパイラで浮動小数点演算が高速になります。
16 にすれば SSE 〜 SSE4 に対応できます。
32 にすれば AVX 〜 AVX2 に対応できます。

● ポコム関数 Append、List と変数 NoList を追加しました。

● EUC-jp でも半角のカナに対応しました。

● 乱数生成をメルセンヌ・ツイスターから TinyMT に変更し、 マルチスレッドに対応し、逆順に生成したり、ジャンプすることができるようにしました。 また32ビット符号なし整数乱数を返す Rand を追加しました。

● 負の整数16進数表示のときに、符号をつけるのをやめました。

● rstrict または __restrict キーワードに対応しました。

● ポコム関数 Clock が与えた引数をコメントとして表示するようにしました。 プログラムから時間のみ表示する場合は Clock(ZeroStr); とするか、Clock(""); としてください。

● ポコム関数 Lap を追加しました。Clock は常に起動時からの経過時間を表示するのに対し、 Lap は最初に呼び出された時は起動時からの経過時間を、2回めからは前回からの経過時間を表示します。 引数を指定すれば、コメントとして表示します。

●マクロ SizeChangedBy( )、ReadIntRange( )、ReadCodeRange( )、ReadRealRange( ) を追加しました。

●CODE, CVEC, CMAT, CJAG のエラーチェックをゆるくしました。

●Format を -2、-3 にすることにより、浮動小数点型を16進数で書き出せるようにしました。

●マクロ NO_RAND を1にすると乱数のプログラムを組み込まないようにしました。 gcc -DNO_RAND や cl /D NO_RAND のようにしても有効です。

●ポコム関数 Free を追加しました。

■version 1.01 と version 2.01 の違い■

●version 1.01 では、例えば Example1 の場合では Example1.c 、 pocom.c 、 pdef.c を 分割コンパイルする必要がありましたが、version 2.01 では Example1.c だけをコンパイルするだけ でよくなりました。pocom.c 、 pdef.c は pocom.h に埋め込まれました。同様に、 anneal.c は anneal.h に埋め込まれました。 最近のハードウエアは性能が高くなってきており、 大きなプログラムも一瞬でコンパイルできるので、使い勝手の良さを優先しました。

■ version 1.01 と version 8.19 の大きさの違い■

Example1.c を Turbo C 1.5 のスモールモデルでコンパイルした 結果( tcc -DJPN Example1.c )の Example1.exe の ファイルサイズは、version 1.01 は 42,898 バイトでしたが version 8.19 は 57,532 バイトになりました。 つまり、version 8.19 になって 14,634 バイト増えました。

また tcc -DNO_AFTER_VER2 Example1.c でバージョン2以降に 追加した機能を外すと 48,114 バイトになり、5,216 バイト増えたことになります。

さらに、tcc -DNO_ALL Example1.c のようにして、必要のないプログラムを組み込まずにコンパイルすると。 36,154 バイトになり、6,744 バイト小さくなりました。

和田維作

isaku@pb4.so-net.ne.jp