最終更新: 2024/7/3

Affine Arithmetic

柏木 雅英

本ページでは、Affine Arithmeticを行うライブラリの使い方を説明する。 が、まだちゃんと書いてない。

1. Affine Arithmeticとは

概要は、 Affine Arithmeticについて (Version: 2024/7/1) に解説がある。

2. ファイル構成

affine.hpp
(下請けとして、interval.hpp, rdouble.hppなど、区間演算関連のファイル)

3. 使い方

test-affine.ccを見てください。 test-affine-reduce.ccはダミー変数の削減のサンプル。

AFFINE_SIMPLEを定義することによってダミー変数追加のポリシーを変えることが出来る。 上の Affine Arithmeticについて の資料の方法1,2,3にそれぞれ 対応している。

/*
 * define simplicity of affine arithmetic
 *
 *   value of AFFINE_SIMPLE                   | 0 | 1 | 2
 *  ------------------------------------------+---+---+---
 *   add dummy epsilon on linear operation    | o | x | x
 *   add dummy epsilon on nonlinear operation | o | o | x
 */
の通り。defaultは1。コンパイル時に-DAFFINE_SIMPLE=0とかすると、線形計算でも ダミー変数を追加するようになり高性能だが遅くなる。-DAFFINE_SIMPLE=2なら逆。

4. 機能詳細

加減乗除、square、sqrt、rad、to_interval, exp, log など。

pow, sin, cos, tan, asin, acos, atan, sinh, cosh, tanh, asinh, acosh, atanh も持っているが、これらは簡易な実装であり、affine arithmericとして bestを尽くしてはいない。

resize, append, splitはode solverで使っている特殊な関数

まだちゃんと書いてないので詳細はソースを見て欲しい。

5. ダミー変数の最大数について

ダミー変数の最大数は、 に格納されている。プログラム開始時は0で、affine変数を区間で 初期化、affine変数に区間を代入、非線形計算(-DAFFINE_SIMPLE=0のときは線形計算でも)を 行う度に+1される。
int i;
i = kv::affine<T>::maxnum();
とすれば読み出せるし、
kv::affine<T>::maxnum() = 5;
のようにすれば書き換えることも出来る。

あるまとまった計算を行い、 次にそれらとはまったく独立な (前の計算で作成されたaffine変数を一切使わない)別の計算を 行う場合、いったんダミー変数の最大数を0にリセットすると 計算の高速化が期待できる。 また、区間化するなどでダミー変数のいくつかが不要になった場合など、 ダミー変数の最大数を減らしたいことがある。 いずれにしても、ダミー変数の最大数の変更はaffine arithmeticの原理を よく理解した上で慎重に行う必要がある。

6. ダミー変数の削減

epsilon_reduceはaffine変数のvectorを受け取って、ダミー変数の 削減を行う関数。詳細は、以下のどちらかを見て下さい。

7. 問題点

2013年の新システム移行に伴って、affineは実行速度が遅くなってしまった。 丸めの向きを「上向き固定」で行うとき、下向きの計算は「符号反転、計算、符号反転」の ように行うが、下向き丸めの計算が連続するときに符号反転の負担が大きいことが 原因と思われる。要改善。