diff --git a/src/mol-data/db/column.ts b/src/mol-data/db/column.ts index 5e53c04d88be1349c003ad77d412055d4c19d296..03394b28d5329a8b101a0ecba41d0c407a775c8c 100644 --- a/src/mol-data/db/column.ts +++ b/src/mol-data/db/column.ts @@ -34,7 +34,7 @@ namespace Column { export type Float = { '@type': 'float', T: number } & Base<'float'> export type Coordinate = { '@type': 'coord', T: number } & Base<'float'> - export type Tensor = { '@type': 'tensor', T: Tensors, space: Tensors.Space } & Base<'tensor'> + export type Tensor = { '@type': 'tensor', T: Tensors.Data, space: Tensors.Space } & Base<'tensor'> export type Aliased<T> = { '@type': 'aliased', T: T } & Base<'str' | 'int'> export type List<T extends number|string> = { '@type': 'list', T: T[], separator: string, itemParse: (x: string) => T } & Base<'list'> diff --git a/src/mol-io/reader/cif/data-model.ts b/src/mol-io/reader/cif/data-model.ts index feb812fa368a40520afcb76825642cd756705ef5..8182d0fca61359721a06f525aa672b7faa404717 100644 --- a/src/mol-io/reader/cif/data-model.ts +++ b/src/mol-io/reader/cif/data-model.ts @@ -78,7 +78,7 @@ export interface Field { toFloatArray(params?: Column.ToArrayParams<number>): ReadonlyArray<number> } -export function getTensor(category: Category, field: string, space: Tensor.Space, row: number): Tensor { +export function getTensor(category: Category, field: string, space: Tensor.Space, row: number): Tensor.Data { const ret = space.create(); if (space.rank === 1) { const rows = space.dimensions[0]; diff --git a/src/mol-io/reader/cif/schema.ts b/src/mol-io/reader/cif/schema.ts index d71b6cc898f65b770c6883bdfcab57f3d1e96375..c0f7e1d20c8ef614911b68cff79680662bab1d63 100644 --- a/src/mol-io/reader/cif/schema.ts +++ b/src/mol-io/reader/cif/schema.ts @@ -71,7 +71,7 @@ function createListColumn<T extends number|string>(schema: Column.Schema.List<T> }; } -function createTensorColumn(schema: Column.Schema.Tensor, category: Data.Category, key: string): Column<Tensor> { +function createTensorColumn(schema: Column.Schema.Tensor, category: Data.Category, key: string): Column<Tensor.Data> { const space = schema.space; let firstFieldName: string; switch (space.rank) { @@ -82,7 +82,7 @@ function createTensorColumn(schema: Column.Schema.Tensor, category: Data.Categor } const first = category.getField(firstFieldName) || Column.Undefined(category.rowCount, schema); const value = (row: number) => Data.getTensor(category, key, space, row); - const toArray: Column<Tensor>['toArray'] = params => ColumnHelpers.createAndFillArray(category.rowCount, value, params) + const toArray: Column<Tensor.Data>['toArray'] = params => ColumnHelpers.createAndFillArray(category.rowCount, value, params) return { schema, diff --git a/src/mol-math/linear-algebra/tensor.ts b/src/mol-math/linear-algebra/tensor.ts index 3efd39d60ebb057788b8e4bda0e12ff292ea971c..5a2231baf00ec1013259a3a30b21884a065003b6 100644 --- a/src/mol-math/linear-algebra/tensor.ts +++ b/src/mol-math/linear-algebra/tensor.ts @@ -6,18 +6,20 @@ import { Mat4, Vec3, Vec4 } from './3d' -export interface Tensor extends Array<number> { '@type': 'tensor' } +export interface Tensor { data: Tensor.Data, space: Tensor.Space } export namespace Tensor { export type ArrayCtor = { new (size: number): ArrayLike<number> } + export interface Data extends Array<number> { '@type': 'tensor' } + export interface Space { readonly rank: number, readonly dimensions: ReadonlyArray<number>, readonly axisOrderSlowToFast: ReadonlyArray<number>, - create(array?: ArrayCtor): Tensor, - get(data: Tensor, ...coords: number[]): number - set(data: Tensor, ...coordsAndValue: number[]): number + create(array?: ArrayCtor): Tensor.Data, + get(data: Tensor.Data, ...coords: number[]): number + set(data: Tensor.Data, ...coordsAndValue: number[]): number } interface Layout { @@ -39,6 +41,8 @@ export namespace Tensor { return { dimensions, axisOrderFastToSlow, axisOrderSlowToFast, accessDimensions, defaultCtor: ctor || Float64Array } } + export function create(space: Space, data: Data): Tensor { return { space, data }; } + export function Space(dimensions: number[], axisOrderSlowToFast: number[], ctor?: ArrayCtor): Space { const layout = Layout(dimensions, axisOrderSlowToFast, ctor); const { get, set } = accessors(layout); @@ -49,7 +53,7 @@ export namespace Tensor { export function ColumnMajorMatrix(rows: number, cols: number, ctor?: ArrayCtor) { return Space([rows, cols], [1, 0], ctor); } export function RowMajorMatrix(rows: number, cols: number, ctor?: ArrayCtor) { return Space([rows, cols], [0, 1], ctor); } - export function toMat4(space: Space, data: Tensor): Mat4 { + export function toMat4(space: Space, data: Tensor.Data): Mat4 { if (space.rank !== 2) throw new Error('Invalid tensor rank'); const mat = Mat4.zero(); const d0 = Math.min(4, space.dimensions[0]), d1 = Math.min(4, space.dimensions[1]); @@ -59,7 +63,7 @@ export namespace Tensor { return mat; } - export function toVec3(space: Space, data: Tensor): Vec3 { + export function toVec3(space: Space, data: Tensor.Data): Vec3 { if (space.rank !== 1) throw new Error('Invalid tensor rank'); const vec = Vec3.zero(); const d0 = Math.min(3, space.dimensions[0]); @@ -67,7 +71,7 @@ export namespace Tensor { return vec; } - export function toVec4(space: Space, data: Tensor): Vec4 { + export function toVec4(space: Space, data: Tensor.Data): Vec4 { if (space.rank !== 1) throw new Error('Invalid tensor rank'); const vec = Vec4.zero(); const d0 = Math.min(4, space.dimensions[0]); @@ -75,7 +79,7 @@ export namespace Tensor { return vec; } - export function areEqualExact(a: Tensor, b: Tensor) { + export function areEqualExact(a: Tensor.Data, b: Tensor.Data) { const len = a.length; if (len !== b.length) return false; for (let i = 0; i < len; i++) if (a[i] !== b[i]) return false; @@ -136,7 +140,7 @@ export namespace Tensor { const { dimensions: ds } = layout; let size = 1; for (let i = 0, _i = ds.length; i < _i; i++) size *= ds[i]; - return ctor => new (ctor || layout.defaultCtor)(size) as Tensor; + return ctor => new (ctor || layout.defaultCtor)(size) as Tensor.Data; } function dataOffset(layout: Layout, coord: number[]) {