Tensor
組込みオブジェクトこの章では組込み変数領域が初めから備えている
Tensor
組込みオブジェクトを定義する。
Tensor
はスクリプトで扱われるテンソルオブジェクトに対応する
Type
のインスタンスである。
以下の条件を全て満たすオブジェクトをテンソルオブジェクトという:
Tensor
のインスタンスであるか、Tensor.prototype
と同じオブジェクトである。dims
という名前の不変の内部メンバを持ち、その値は
一つ以上の 0 以上の整数からなる原始リストである。elements
という名前の内部メンバを持ち、その値は
dims
内部メンバの値を型とするテンソル原始リストである。テンソルオブジェクトは、インデックスにより区別される有限個のオブジェクトの
集合体を表す。テンソルオブジェクトの elements
内部メンバの値に
含まれる各オブジェクトをテンソルオブジェクトの要素といい、
dims
内部メンバの値をテンソルオブジェクトの型という。
一般にテンソルオブジェクトの内容は読み取り専用ではないが、テンソル
オブジェクトの isReadOnly
プロパティに
Boolean.true
を設定すると、テンソルオブジェクトの要素は読み取り専用とみなされる。
読み取り専用であるかどうかに関わらず、テンソルオブジェクトの型は
そのテンソルオブジェクトについて不変である。
テンソルオブジェクトは、少なくとも作られた当初は Tensor
のインスタンスでなければならない (Tensor.prototype
自身がテンソルオブジェクトと見なされる場合を除く)。
テンソルオブジェクトのプロトタイプが変更されて Tensor
のインスタンスではなくなった場合、それ以降そのオブジェクトを
テンソルオブジェクトと見なすかどうかは実行環境の裁量による。
n を 1 以上の整数とし、n 個の 0 以上の整数 d1, d2, …, dn からなる原始リストを d とする。原始リスト l が以下の条件を満たすとき、l は d を型とするテンソル原始リストである:
またこの時、n を l の階数という。すなわち、 l は n 階のテンソル原始リストである。
さらに n 個の整数 i1, i2, …, in が l の有効なインデックスであるとは、1 以上 n 以下の任意の整数 k について 1 ≤ ik ≤ dk が成り立つことである。
テンソル生成式 Tensor: LeftBrace Expressions? Comma? RightBrace の評価は、次のように行う:
elements
内部メンバの値とする、読み取り専用でない
新しいテンソルオブジェクトを T とする。テンソル生成式 Tensor: LeftBrace (&MatrixTester Expressions Comma? EOS)+ RightBrace の評価は、次のように行う:
elements
内部メンバの値とする、読み取り専用でない
新しいテンソルオブジェクトを T とする。Tensor
のメンバprototype
Object.prototype
を準プロトタイプとするオブジェクト。name
"Tensor"
map
メソッドNumberOfArgumentsError
のインスタンスを投げる。NotCallableError
のインスタンスを投げる。Void.void
を @this 値とし、
T1, T2, …, Tn を引数として F
を関数として呼出し、その結果を返す。elements
内部メンバの値を e0 とする。
もし異なる型のテンソルオブジェクトが存在すれば、新しい DimensionError
のインスタンスを投げる。elements
内部メンバの値を
ei とする。Void.void
を @this
値とし、a1, a2, …,
an を引数として F
を関数として呼出し、その結果に対して get-reference-value
を行い、その結果を ri1,i2,…,im
とする。そしてそれが正常終了でなければ、直ちにそれを返す。elements
内部メンバの値とする読み取り専用でない新しいテンソルオブジェクト]]
を返す。Tensor
の内部メンバ$prototype
Type.prototype
Tensor
の関数としての呼出しTensor
は関数として呼出し可能であり、関数として呼出されると次の処理を行う:
NumberOfArgumentsError
のインスタンスを投げる。Real
オブジェクトならば、以下の動作を行う:
OufOfRangeError
のインスタンスを投げる。Void.void
とする。dims
内部メンバの値とし、e を
elements
内部メンバの値とする、読み取り専用でない新しい
テンソルオブジェクト]] を返す。テンソルオブジェクトは以下のプロパティを持つ。ただし、
Tensor.prototype
やその準プロトタイプのプロパティが
スクリプトの実行によって変更された場合は、この限りではない。
count
Integer
オブジェクトである。この値は、
このテンソルオブジェクトに含まれている要素の個数、すなわち dims
内部メンバの値に含まれている全ての整数の積を表す。dims
Integer
オブジェクトであり、その個数はこのテンソルオブジェクトの型に含まれる整数の個数に
等しい。リストオブジェクトの i 個目の要素となっている Integer
オブジェクトは、このテンソルオブジェクトの型に含まれる
i 個目の整数を表す。isReadOnly
isReadOnly
内部メンバを持つならば、
このプロパティの値は初期の Boolean.true
である。さもなくば、このプロパティの値は初期の
Boolean.false
である。Boolean.false
を代入することと同じように処理される。Boolean.true
ならば、
isReadOnly
内部メンバを持たなければ、isReadOnly
内部メンバを作成し
N をその値に設定する。Boolean.false
ならば、
isReadOnly
内部メンバを持つならば、新しい ReadOnlyError
のインスタンスを投げる。TypeError
のインスタンスを投げる。@true
を代入することで、
テンソルを読み取り専用にすることができる。一度読み取り専用になったテンソルを
元の状態に戻すことは出来ない。map
メソッドNumberOfArgumentsError
のインスタンスを投げる。Void.void
を @this
値とし、F, T1, T2, …,
Tn を引数として、 Tensor.map
を関数として呼出し、その結果を返す。contractWith
メソッドNumberOfArgumentsError
のインスタンスを投げる。TypeError
のインスタンスを投げる。& #1 #2
を評価して得られるような
関数オブジェクトを F とする。F
が関数として呼出し可能でなければ、新しい
NotCallableError
のインスタンスを投げる。Math.sum
を
G とする。G が関数として呼出し可能でなければ、新しい
NotCallableError
のインスタンスを投げる。elements
内部メンバの値をそれぞれ e, e′ とする。DimensionError
のインスタンスを投げる。Void.void
を @this 値とし、
e[i1][i2]...[ir−1][k] と
e′[k][ir][ir+1]...[ir+r′−2] の二つの引数で F を関数として呼出し、
その結果に対して get-reference-value を行い、その結果を sk とする。そしてそれが正常終了でなければ直ちにそれを返す。Void.void
を @this
値とし、s1, s2, …,
sdr
のそれぞれの値を引数として G を関数として呼出し、その結果に対して
get-reference-value
を行い、その結果を ti1,i2,…,ir+r′−2
とする。そしてそれが正常終了でなければ、直ちにそれを返す。elements
内部メンバの値とする読み取り専用でない新しいテンソルオブジェクト]]
を返す。Void.void
を @this 値とし、
e[k] と e′[k] の二つの引数で
F を関数として呼出し、
その結果に対して get-reference-value を行い、その結果を sk とする。そしてそれが正常終了でなければ直ちにそれを返す。Void.void
を @this
値とし、s1, s2, …,
sdr
のそれぞれの値を引数として G
を関数として呼出し、その結果を返す。$plus
メソッドmap
メソッドを呼出し、その結果を返す: & +#
$add
メソッドmap
メソッドを呼出し、その結果を返す: & #1 + #2
$increment
メソッドmap
メソッドを呼出し、その結果を返す: & #.$increment[]
$minus
メソッドmap
メソッドを呼出し、その結果を返す: & -#
$subtract
メソッドmap
メソッドを呼出し、その結果を返す: & #1 - #2
$decrement
メソッドmap
メソッドを呼出し、その結果を返す: & #.$decrement[]
$multiply
メソッドmap
メソッドを呼出し、その結果を返す: & #1 * #2
$reciprocal
メソッドmap
メソッドを呼出し、その結果を返す: & /#
$divide
メソッドmap
メソッドを呼出し、その結果を返す: & #1 / #2
$quotient
メソッドmap
メソッドを呼出し、その結果を返す: & #1 \ #2
$mod
メソッドmap
メソッドを呼出し、その結果を返す: & #1 % #2
$power
メソッドmap
メソッドを呼出し、その結果を返す: & #1 ^ #2
$less
メソッドmap
メソッドを呼出し、その結果を返す: & #1 < #2
$greater
メソッドmap
メソッドを呼出し、その結果を返す: & #1 > #2
$lessEqual
メソッドmap
メソッドを呼出し、その結果を返す: & #1 <= #2
$greaterEqual
メソッドmap
メソッドを呼出し、その結果を返す: & #1 >= #2
$equal
メソッドBoolean.false
]] を返す。& #1 == #2
を評価して得られるような
関数オブジェクトと X を引数としてこのテンソルオブジェクトの
map
メソッドを呼出し、その結果を
r とする。r
が正常終了でなければ、直ちにそれを返す。Boolean.true
]] を、さもなくば [[初期の Boolean.false
]] を返す。$juxtapose
メソッドcontractWith
メソッドを呼出し、その結果を返す。map
メソッドを二つの引数で呼出し、その結果を返す。
一つ目の引数は、関数生成式 & #1 #2
を評価して得られるような関数オブジェクトとする。
二つ目の引数は、この呼出しで渡された引数とする。toList
メソッドelements
内部メンバの値がこのテンソルオブジェクトの elements
内部メンバの平坦化リストであるような新しいリストオブジェクト]] を返す。ただし、n 階のテンソル原始リスト
e の平坦化リストとは、以下のような 1 階のテンソル原始リスト
f である:
copy
メソッドdims
内部メンバおよび
elements
内部メンバを持つ。getEnum
メソッドtoNext
メソッドが null
を返す) までに
このテンソルオブジェクトの elements
内部メンバが変更された場合は、
それ以降の列挙操作の挙動は規定しない。toNext
メソッド@{ @this.getEnum[].toNext[] }
$prototype
Tensor.prototype
、または Tensor.prototype
を準プロトタイプとするオブジェクト。dims
elements
dims
内部メンバの値を型とするテンソル原始リスト。
このテンソル原始リストはテンソルオブジェクトの要素を保持する。isReadOnly
テンソルオブジェクトは関数として呼出し可能である。 テンソルオブジェクトが関数として呼出されると次の処理を行う:
Tensor
のインスタンスを T
とする。elements
内部メンバの値の階数を r
とする。この呼出しで渡された引数の個数が r でなければ、新しい
NumberOfArgumentsError
のインスタンスを投げる。Real
オブジェクトならば、以下の動作を行う:
Real
オブジェクトまたは Interval
のインスタンスならば、以下の動作を行う:
Real
オブジェクトならば、それに対して real-to-int を行い、その結果を
ik とする。さらに ik = jk
とする。ただし、real-to-int の結果が null である場合は、代わりに
ik = 1, jk
= 0 とする。Interval
のインスタンスならば、それに対して ints-in-interval を行う。
その結果が正常終了でなければ、直ちにそれを返す。あるいはその結果が [[null]]
ならば、これ以降の動作は、未定義である。さもなくば、その結果の値は
整数の集合であるはずであるので、それを I とする。
I に含まれる最小の正の整数を ik,
最大の dk 以下の正の整数を
jk とする。ただし I
に正の整数が含まれていない場合は、ik = 1,
jk = 0 とする。テンソル要素参照は参照の一種である。全てのテンソル要素参照は、それぞれ対応する
テンソルオブジェクト T と r 個の整数
i1, i2, …,
ir を持つ。ただし r は
T の elements
内部メンバの値の階数である。
テンソル要素参照に対する動作を以下に定める:
elements
内部メンバの値を
e とする。Boolean.true
]] を、
さもなくば [[初期の Boolean.false
]] を返す。elements
内部メンバの値を
e とする。OutOfRangeError
のインスタンスを投げる。elements
内部メンバの値を
e とする。isReadOnly
プロパティの値が初期の Boolean.true
ならば、新しい ReadOnlyError
のインスタンスを投げる。OutOfRangeError
のインスタンスを投げる。elements
内部メンバの値を e′
に変更する。ReadOnlyError
のインスタンスを投げる。テンソル範囲参照は参照の一種である。全てのテンソル範囲参照は、それぞれ対応する
テンソルオブジェクト T と r 個の整数
i1, i2, …,
ir および j1,
j2, …, jr
を持つ。ただし r は T の elements
内部メンバの値の階数である。
テンソル範囲参照に対する動作を以下に定める:
Boolean.true
]]
を返す。elements
内部メンバの値を e
とする。elements
内部メンバの値とする、
読み取り専用でない新しいテンソルオブジェクト]] を返す。elements
内部メンバの値を e
とする。isReadOnly
プロパティの値が初期の Boolean.true
ならば、新しい ReadOnlyError
のインスタンスを投げる。elements
内部メンバの値を e″
とする。DimensionError
のインスタンスを投げる。elements
内部メンバの値を、e′
に変更する。ReadOnlyError
のインスタンスを投げる。