tscommons-esm-algorithms-ai 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,41 @@
1
+ import { ICommonsAiModelPredictable, ICommonsAiModelTrainable, TCommonsAiGenericTrainingData, TCommonsAiPrediction, TCommonsAiQuality, TCommonsAiTrainingStats } from 'tscommons-esm-ai';
2
+ type TDataWithDistance<InputT, OutputT> = TCommonsAiGenericTrainingData<InputT, OutputT> & {
3
+ distance: number;
4
+ };
5
+ export type TCommonsAlgorithmAiOutputWithDistance<OutputT> = Pick<TDataWithDistance<unknown, OutputT>, 'output' | 'distance'>;
6
+ export declare abstract class CommonsAlgorithmAiKNearestNeighbourClassifier<InputT, OutputT> implements ICommonsAiModelTrainable<InputT, OutputT, TCommonsAiTrainingStats>, ICommonsAiModelPredictable<InputT, OutputT> {
7
+ private k;
8
+ private expandKToIdenticalDistances;
9
+ private data;
10
+ constructor(k?: number, expandKToIdenticalDistances?: boolean);
11
+ load(data: TCommonsAiGenericTrainingData<InputT, OutputT>[]): void;
12
+ build(): Promise<void>;
13
+ train(): Promise<TCommonsAiTrainingStats | undefined>;
14
+ protected abstract calculateDistance(a: InputT, b: InputT): number;
15
+ protected abstract getConsensus(neighbours: TCommonsAlgorithmAiOutputWithDistance<OutputT>[]): TCommonsAiPrediction<OutputT> | undefined;
16
+ predict(input: InputT): Promise<TCommonsAiPrediction<OutputT> | undefined>;
17
+ protected abstract calculateQuality(actual: TCommonsAiPrediction<OutputT>, expected: OutputT): [number, number];
18
+ test(testData: TCommonsAiGenericTrainingData<InputT, OutputT>[]): Promise<TCommonsAiQuality>;
19
+ }
20
+ export declare abstract class CommonsAlgorithmAiKNearestNeighbourEnumClassifier<InputT, E extends string> extends CommonsAlgorithmAiKNearestNeighbourClassifier<InputT, E> {
21
+ protected values: E[];
22
+ constructor(values: E[], k?: number, expandKToIdenticalDistances?: boolean);
23
+ loadMap(data: Map<E, InputT[]>): void;
24
+ }
25
+ export declare abstract class CommonsAlgorithmAiKNearestNeighbourNormalisedNumericInputEnumClassifier<InputT, E extends string> implements ICommonsAiModelTrainable<InputT, E, TCommonsAiTrainingStats>, ICommonsAiModelPredictable<InputT, E> {
26
+ private values;
27
+ private k?;
28
+ private normaliseInput;
29
+ private expandKToIdenticalDistances;
30
+ private sourceData;
31
+ private numericClassifier;
32
+ constructor(values: E[], k?: number | undefined, normaliseInput?: boolean, expandKToIdenticalDistances?: boolean);
33
+ protected abstract numericiseInput(input: InputT): number[];
34
+ protected abstract getConsensus(neighbours: TCommonsAlgorithmAiOutputWithDistance<E>[]): TCommonsAiPrediction<E> | undefined;
35
+ loadMap(data: Map<E, InputT[]>): void;
36
+ build(): Promise<void>;
37
+ train(): Promise<TCommonsAiTrainingStats | undefined>;
38
+ predict(value: InputT): Promise<TCommonsAiPrediction<E> | undefined>;
39
+ test(testData: TCommonsAiGenericTrainingData<InputT, E>[]): Promise<TCommonsAiQuality>;
40
+ }
41
+ export {};
@@ -0,0 +1,198 @@
1
+ /* eslint-disable @typescript-eslint/require-await */
2
+ import { commonsArrayEmpty, commonsArrayRapidSortHead } from 'tscommons-esm-core';
3
+ import { commonsAlgorithmAiNormaliseInput } from '../helpers/normalise-input.mjs';
4
+ export class CommonsAlgorithmAiKNearestNeighbourClassifier {
5
+ k;
6
+ expandKToIdenticalDistances;
7
+ data = [];
8
+ constructor(k = 1, expandKToIdenticalDistances = false) {
9
+ this.k = k;
10
+ this.expandKToIdenticalDistances = expandKToIdenticalDistances;
11
+ if (k < 1)
12
+ throw new Error('k cannot be less than 1');
13
+ }
14
+ load(data) {
15
+ this.data = data.slice();
16
+ }
17
+ async build() {
18
+ // do nothing
19
+ }
20
+ async train() {
21
+ // do nothing
22
+ return undefined;
23
+ }
24
+ async predict(input) {
25
+ if (this.data.length === 0)
26
+ return undefined;
27
+ // efficiency hack
28
+ const typecast = this.data;
29
+ for (const d of typecast) {
30
+ d.distance = this.calculateDistance(input, d.input);
31
+ }
32
+ try {
33
+ const nearests = commonsArrayRapidSortHead(typecast, this.k, (a, b) => a.distance < b.distance);
34
+ if (nearests.length === 0)
35
+ return undefined;
36
+ if (this.expandKToIdenticalDistances) {
37
+ const equals = [];
38
+ for (const nearest of nearests) {
39
+ equals.push(...typecast
40
+ .filter((d) => d.distance === nearest.distance));
41
+ }
42
+ equals
43
+ .sort((a, b) => {
44
+ if (a.distance < b.distance)
45
+ return -1;
46
+ if (a.distance > b.distance)
47
+ return 1;
48
+ return 0;
49
+ });
50
+ let cutoff = Math.min(this.k, equals.length);
51
+ while (cutoff < equals.length && equals[cutoff].distance === equals[0].distance)
52
+ cutoff++;
53
+ commonsArrayEmpty(nearests);
54
+ nearests.push(...equals.slice(0, cutoff));
55
+ if (nearests.length === 0)
56
+ throw new Error('Post expand nearest size was 0. This should not be possible');
57
+ }
58
+ return this.getConsensus(nearests);
59
+ }
60
+ finally {
61
+ // efficiency hack cleanup
62
+ for (const d of typecast) {
63
+ delete d.distance;
64
+ }
65
+ }
66
+ }
67
+ async test(testData) {
68
+ if (testData.length === 0)
69
+ throw new Error('No data to test on');
70
+ let positiveQuality = 0;
71
+ let negativeQuality = 0;
72
+ for (const test of testData) {
73
+ const prediction = await this.predict(test.input);
74
+ if (!prediction) {
75
+ negativeQuality++;
76
+ }
77
+ else {
78
+ const [positive, negative] = this.calculateQuality(prediction, test.output);
79
+ positiveQuality += positive;
80
+ negativeQuality += negative;
81
+ }
82
+ }
83
+ return {
84
+ positive: positiveQuality / testData.length,
85
+ negative: negativeQuality / testData.length
86
+ };
87
+ }
88
+ }
89
+ export class CommonsAlgorithmAiKNearestNeighbourEnumClassifier extends CommonsAlgorithmAiKNearestNeighbourClassifier {
90
+ values;
91
+ constructor(values, k, expandKToIdenticalDistances) {
92
+ super(k, expandKToIdenticalDistances);
93
+ this.values = values;
94
+ }
95
+ loadMap(data) {
96
+ const rebuild = [];
97
+ for (const value of this.values) {
98
+ rebuild.push(...(data.get(value) || [])
99
+ .map((input) => ({
100
+ input: input,
101
+ output: value
102
+ })));
103
+ }
104
+ this.load(rebuild);
105
+ }
106
+ }
107
+ class NumericClassifier extends CommonsAlgorithmAiKNearestNeighbourEnumClassifier {
108
+ getConsensusCallback;
109
+ constructor(getConsensusCallback, values, k, expandKToIdenticalDistances) {
110
+ super(values, k, expandKToIdenticalDistances);
111
+ this.getConsensusCallback = getConsensusCallback;
112
+ }
113
+ calculateDistance(a, b) {
114
+ if (a.length !== b.length)
115
+ throw new Error('a and b are not equal length');
116
+ let squares = 0;
117
+ for (let i = a.length; i-- > 0;)
118
+ squares += Math.pow(a[i] - b[i], 2);
119
+ return Math.sqrt(squares);
120
+ }
121
+ getConsensus(neighbours) {
122
+ return this.getConsensusCallback(neighbours);
123
+ }
124
+ calculateQuality(actual, expected) {
125
+ if (actual.prediction === expected)
126
+ return [1, 0];
127
+ return [0, 1];
128
+ }
129
+ }
130
+ export class CommonsAlgorithmAiKNearestNeighbourNormalisedNumericInputEnumClassifier {
131
+ values;
132
+ k;
133
+ normaliseInput;
134
+ expandKToIdenticalDistances;
135
+ sourceData;
136
+ numericClassifier;
137
+ constructor(values, k, normaliseInput = false, expandKToIdenticalDistances = false) {
138
+ this.values = values;
139
+ this.k = k;
140
+ this.normaliseInput = normaliseInput;
141
+ this.expandKToIdenticalDistances = expandKToIdenticalDistances;
142
+ }
143
+ loadMap(data) {
144
+ this.sourceData = data;
145
+ }
146
+ async build() {
147
+ if (!this.sourceData)
148
+ throw new Error('No source data. Use loadMap first');
149
+ const flattened = [];
150
+ for (const value of this.values) {
151
+ flattened.push(...(this.sourceData.get(value) || [])
152
+ .map((input) => ({
153
+ input: this.numericiseInput(input),
154
+ output: value
155
+ })));
156
+ }
157
+ if (this.normaliseInput)
158
+ commonsAlgorithmAiNormaliseInput(flattened);
159
+ this.numericClassifier = new NumericClassifier((neighbours) => this.getConsensus(neighbours), this.values, this.k, this.expandKToIdenticalDistances);
160
+ this.numericClassifier.load(flattened);
161
+ }
162
+ async train() {
163
+ if (!this.numericClassifier)
164
+ throw new Error('Model has not been built yet');
165
+ // do nothing
166
+ return undefined;
167
+ }
168
+ async predict(value) {
169
+ if (!this.numericClassifier)
170
+ throw new Error('Model has not been built yet');
171
+ const numericised = this.numericiseInput(value);
172
+ return this.numericClassifier.predict(numericised);
173
+ }
174
+ async test(testData) {
175
+ if (!this.numericClassifier)
176
+ throw new Error('Model has not been built yet');
177
+ if (testData.length === 0)
178
+ throw new Error('No data to test on');
179
+ let positiveQuality = 0;
180
+ let negativeQuality = 0;
181
+ for (const test of testData) {
182
+ const prediction = await this.predict(test.input);
183
+ if (!prediction) {
184
+ negativeQuality++;
185
+ }
186
+ else {
187
+ const [positive, negative] = this.numericClassifier.calculateQuality(prediction, test.output);
188
+ positiveQuality += positive;
189
+ negativeQuality += negative;
190
+ }
191
+ }
192
+ return {
193
+ positive: positiveQuality / testData.length,
194
+ negative: negativeQuality / testData.length
195
+ };
196
+ }
197
+ }
198
+ //# sourceMappingURL=knearest-neighbour-classifier.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"knearest-neighbour-classifier.mjs","sourceRoot":"","sources":["../../src/classes/knearest-neighbour-classifier.mts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { TPrimative } from 'tscommons-esm-core';
2
+ export declare abstract class CommonsAlgorithmAiQLearningTransitionModel<StateT, ActionT> {
3
+ private alpha;
4
+ private epsilon;
5
+ private q;
6
+ constructor(alpha: number, epsilon?: number);
7
+ protected abstract stateActionToIndex(state: StateT, action: ActionT): TPrimative;
8
+ protected abstract listAvailableActions(state: StateT): ActionT[];
9
+ private getStateQ;
10
+ private listActionsAndRewards;
11
+ private bestFutureReward;
12
+ chooseAction(state: StateT): ActionT | undefined;
13
+ private updateQ;
14
+ update(oldState: StateT, action: ActionT, newState: StateT, reward: number): void;
15
+ reward(oldState: StateT, action: ActionT, newState: StateT, magnitude?: number): void;
16
+ punish(oldState: StateT, action: ActionT, newState: StateT, magnitude?: number): void;
17
+ touch(oldState: StateT, action: ActionT, newState: StateT): void;
18
+ }
@@ -0,0 +1,71 @@
1
+ export class CommonsAlgorithmAiQLearningTransitionModel {
2
+ alpha;
3
+ epsilon;
4
+ q;
5
+ constructor(alpha, epsilon = 0) {
6
+ this.alpha = alpha;
7
+ this.epsilon = epsilon;
8
+ this.q = new Map();
9
+ }
10
+ getStateQ(state, action) {
11
+ const index = this.stateActionToIndex(state, action);
12
+ const q = this.q.get(index);
13
+ if (q === undefined)
14
+ return 0;
15
+ return q;
16
+ }
17
+ listActionsAndRewards(state) {
18
+ const actions = this.listAvailableActions(state);
19
+ return actions
20
+ .map((action) => ({
21
+ action: action,
22
+ reward: this.getStateQ(state, action)
23
+ }));
24
+ }
25
+ bestFutureReward(state) {
26
+ const actionsAndRewards = this.listActionsAndRewards(state);
27
+ if (actionsAndRewards.length === 0)
28
+ return 0;
29
+ return Math.max(...actionsAndRewards
30
+ .map((ar) => ar.reward));
31
+ }
32
+ chooseAction(state) {
33
+ const actionsAndRewards = this.listActionsAndRewards(state);
34
+ if (actionsAndRewards.length === 0)
35
+ return undefined;
36
+ const maxReward = Math.max(...actionsAndRewards
37
+ .map((ar) => ar.reward));
38
+ const bestActions = actionsAndRewards
39
+ .filter((ar) => ar.reward === maxReward)
40
+ .map((ar) => ar.action);
41
+ if (bestActions.length === 0)
42
+ return undefined;
43
+ if (Math.random() < this.epsilon) {
44
+ return actionsAndRewards[Math.floor(actionsAndRewards.length * Math.random())].action;
45
+ }
46
+ return bestActions[Math.floor(bestActions.length * Math.random())];
47
+ }
48
+ updateQ(state, action, oldQ, reward, futureRewards) {
49
+ const index = this.stateActionToIndex(state, action);
50
+ this.q.set(index, oldQ + (this.alpha * ((reward + futureRewards) - oldQ)));
51
+ }
52
+ update(oldState, action, newState, reward) {
53
+ const oldQ = this.getStateQ(oldState, action);
54
+ const bestFutureReward = this.bestFutureReward(newState);
55
+ this.updateQ(oldState, action, oldQ, reward, bestFutureReward);
56
+ }
57
+ reward(oldState, action, newState, magnitude = 1) {
58
+ if (magnitude < 0)
59
+ throw new Error('Reward cannot be negative. Use update for a generic any-magnitude');
60
+ this.update(oldState, action, newState, magnitude);
61
+ }
62
+ punish(oldState, action, newState, magnitude = 1) {
63
+ if (magnitude < 0)
64
+ throw new Error('Punishment cannot be negative. Use update for a generic any-magnitude');
65
+ this.update(oldState, action, newState, -magnitude);
66
+ }
67
+ touch(oldState, action, newState) {
68
+ this.update(oldState, action, newState, 0);
69
+ }
70
+ }
71
+ //# sourceMappingURL=q-learning-transition-model.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"q-learning-transition-model.mjs","sourceRoot":"","sources":["../../src/classes/q-learning-transition-model.mts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { TCommonsAiPrediction } from 'tscommons-esm-ai';
2
+ import { TCommonsAlgorithmAiOutputWithDistance } from '../classes/knearest-neighbour-classifier.mjs';
3
+ export declare function commonsAlgorithmAiNearestNeighbourSimpleConsensus<E extends string>(values: E[], neighbours: TCommonsAlgorithmAiOutputWithDistance<E>[]): TCommonsAiPrediction<E> | undefined;
4
+ export declare function commonsAlgorithmAiNearestNeighbourWeightedConsensus<E extends string>(values: E[], neighbours: TCommonsAlgorithmAiOutputWithDistance<E>[]): TCommonsAiPrediction<E> | undefined;
@@ -0,0 +1,32 @@
1
+ import { CommonsTally, commonsNumberAverage } from 'tscommons-esm-core';
2
+ function genericConsensus(values, neighbours, handle) {
3
+ if (neighbours.length === 0)
4
+ return undefined;
5
+ const tally = new CommonsTally(values);
6
+ for (const neighbour of neighbours) {
7
+ handle(tally, neighbour);
8
+ }
9
+ const best = tally.winner;
10
+ if (best === undefined)
11
+ return undefined;
12
+ const distance = commonsNumberAverage(neighbours
13
+ .filter((neighbour) => neighbour.output === best)
14
+ .map((neighbour) => neighbour.distance));
15
+ if (distance === undefined)
16
+ throw new Error('Unable to determine distance for consensus');
17
+ return {
18
+ prediction: best,
19
+ certainty: distance
20
+ };
21
+ }
22
+ export function commonsAlgorithmAiNearestNeighbourSimpleConsensus(values, neighbours) {
23
+ return genericConsensus(values, neighbours, (tally, neighbour) => {
24
+ tally.increment(neighbour.output);
25
+ });
26
+ }
27
+ export function commonsAlgorithmAiNearestNeighbourWeightedConsensus(values, neighbours) {
28
+ return genericConsensus(values, neighbours, (tally, neighbour) => {
29
+ tally.add(neighbour.output, -neighbour.distance); // negative so we give bias towards the closest
30
+ });
31
+ }
32
+ //# sourceMappingURL=nearest-neighbour.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nearest-neighbour.mjs","sourceRoot":"","sources":["../../src/helpers/nearest-neighbour.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAKxE,SAAS,gBAAgB,CACvB,MAAW,EACX,UAAsD,EACtD,MAGS;IAEV,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAE9C,MAAM,KAAK,GAAoB,IAAI,YAAY,CAAI,MAAM,CAAC,CAAC;IAC3D,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACpC,MAAM,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IAC1B,CAAC;IAED,MAAM,IAAI,GAAgB,KAAK,CAAC,MAAM,CAAC;IACvC,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAEzC,MAAM,QAAQ,GAAqB,oBAAoB,CACrD,UAAU;SACP,MAAM,CAAC,CAAC,SAAmD,EAAW,EAAE,CAAC,SAAS,CAAC,MAAM,KAAK,IAAI,CAAC;SACnG,GAAG,CAAC,CAAC,SAAmD,EAAU,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,CAC5F,CAAC;IACF,IAAI,QAAQ,KAAK,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAE1F,OAAO;QACL,UAAU,EAAE,IAAI;QAChB,SAAS,EAAE,QAAQ;KACpB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iDAAiD,CAC/D,MAAW,EACX,UAAsD;IAEvD,OAAO,gBAAgB,CACrB,MAAM,EACN,UAAU,EACV,CACE,KAAsB,EACtB,SAAmD,EAC7C,EAAE;QACT,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACnC,CAAC,CACF,CAAC;AACH,CAAC;AAED,MAAM,UAAU,mDAAmD,CACjE,MAAW,EACX,UAAsD;IAEvD,OAAO,gBAAgB,CACrB,MAAM,EACN,UAAU,EACV,CACE,KAAsB,EACtB,SAAmD,EAC7C,EAAE;QACT,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,+CAA+C;IAClG,CAAC,CACF,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { TCommonsAiGenericTrainingData } from 'tscommons-esm-ai';
2
+ export declare function commonsAlgorithmAiNormaliseInput<I extends number[]>(data: TCommonsAiGenericTrainingData<I, unknown>[]): void;
@@ -0,0 +1,24 @@
1
+ export function commonsAlgorithmAiNormaliseInput(data) {
2
+ if (data.length === 0)
3
+ return;
4
+ const inputLength = data[0].input.length;
5
+ const minMaxs = [];
6
+ for (let i = 0; i < inputLength; i++) {
7
+ const values = data
8
+ .map((value) => value.input[i]);
9
+ const min = Math.min(...values);
10
+ const max = Math.max(...values);
11
+ minMaxs.push({
12
+ min: min,
13
+ max: max,
14
+ delta: min === max ? 1 : (max - min)
15
+ });
16
+ }
17
+ for (const item of data) {
18
+ if (item.input.length !== inputLength)
19
+ throw new Error('Inconsistent input lengths');
20
+ for (let i = inputLength; i-- > 0;)
21
+ item.input[i] = (item.input[i] - minMaxs[i].min) / minMaxs[i].delta;
22
+ }
23
+ }
24
+ //# sourceMappingURL=normalise-input.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalise-input.mjs","sourceRoot":"","sources":["../../src/helpers/normalise-input.mts"],"names":[],"mappings":"AAEA,MAAM,UAAU,gCAAgC,CAAqB,IAAiD;IACrH,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAE9B,MAAM,WAAW,GAAW,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC;IAOjD,MAAM,OAAO,GAAc,EAAE,CAAC;IAE9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,MAAM,GAAa,IAAI;aAC1B,GAAG,CAAC,CAAC,KAAgD,EAAU,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAErF,MAAM,GAAG,GAAW,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC;QACxC,MAAM,GAAG,GAAW,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC;QACxC,OAAO,CAAC,IAAI,CAAC;YACX,GAAG,EAAE,GAAG;YACR,GAAG,EAAE,GAAG;YACR,KAAK,EAAE,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC;SACrC,CAAC,CAAC;IACJ,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,WAAW;YAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAErF,KAAK,IAAI,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,GAAG,CAAC;YAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IACzG,CAAC;AACF,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { commonsAlgorithmAiNormaliseInput } from './helpers/normalise-input.mjs';
2
+ import { commonsAlgorithmAiNearestNeighbourSimpleConsensus, commonsAlgorithmAiNearestNeighbourWeightedConsensus } from './helpers/nearest-neighbour.mjs';
3
+ import { CommonsAlgorithmAiQLearningTransitionModel } from './classes/q-learning-transition-model.mjs';
4
+ import { TCommonsAlgorithmAiOutputWithDistance, CommonsAlgorithmAiKNearestNeighbourClassifier, CommonsAlgorithmAiKNearestNeighbourEnumClassifier, CommonsAlgorithmAiKNearestNeighbourNormalisedNumericInputEnumClassifier } from './classes/knearest-neighbour-classifier.mjs';
5
+ export { commonsAlgorithmAiNormaliseInput, commonsAlgorithmAiNearestNeighbourSimpleConsensus, commonsAlgorithmAiNearestNeighbourWeightedConsensus, CommonsAlgorithmAiQLearningTransitionModel, TCommonsAlgorithmAiOutputWithDistance, CommonsAlgorithmAiKNearestNeighbourClassifier, CommonsAlgorithmAiKNearestNeighbourEnumClassifier, CommonsAlgorithmAiKNearestNeighbourNormalisedNumericInputEnumClassifier };
package/dist/index.mjs ADDED
@@ -0,0 +1,6 @@
1
+ import { commonsAlgorithmAiNormaliseInput } from './helpers/normalise-input.mjs';
2
+ import { commonsAlgorithmAiNearestNeighbourSimpleConsensus, commonsAlgorithmAiNearestNeighbourWeightedConsensus } from './helpers/nearest-neighbour.mjs';
3
+ import { CommonsAlgorithmAiQLearningTransitionModel } from './classes/q-learning-transition-model.mjs';
4
+ import { CommonsAlgorithmAiKNearestNeighbourClassifier, CommonsAlgorithmAiKNearestNeighbourEnumClassifier, CommonsAlgorithmAiKNearestNeighbourNormalisedNumericInputEnumClassifier } from './classes/knearest-neighbour-classifier.mjs';
5
+ export { commonsAlgorithmAiNormaliseInput, commonsAlgorithmAiNearestNeighbourSimpleConsensus, commonsAlgorithmAiNearestNeighbourWeightedConsensus, CommonsAlgorithmAiQLearningTransitionModel, CommonsAlgorithmAiKNearestNeighbourClassifier, CommonsAlgorithmAiKNearestNeighbourEnumClassifier, CommonsAlgorithmAiKNearestNeighbourNormalisedNumericInputEnumClassifier };
6
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","sourceRoot":"","sources":["../src/index.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gCAAgC,EAAE,MAAM,+BAA+B,CAAC;AACjF,OAAO,EAAE,iDAAiD,EAAE,mDAAmD,EAAE,MAAM,iCAAiC,CAAC;AACzJ,OAAO,EAAE,0CAA0C,EAAE,MAAM,2CAA2C,CAAC;AACvG,OAAO,EAEL,6CAA6C,EAC7C,iDAAiD,EACjD,uEAAuE,EACxE,MAAM,6CAA6C,CAAC;AACrD,OAAO,EACN,gCAAgC,EAChC,iDAAiD,EACjD,mDAAmD,EACnD,0CAA0C,EAE1C,6CAA6C,EAC7C,iDAAiD,EACjD,uEAAuE,EACvE,CAAC"}
package/package.json ADDED
@@ -0,0 +1,31 @@
1
+ {
2
+ "name": "tscommons-esm-algorithms-ai",
3
+ "version": "0.0.2",
4
+ "description": "",
5
+ "scripts": {
6
+ "tsc": "./node_modules/typescript/bin/tsc",
7
+ "preprepare": "rm -rf ./dist; php ~/Dev/etim.php src/ && npm run tsc",
8
+ "publish-major": "rm -rf dist; npm run tsc && npx eslint . && npm run preprepare && npm version major && npm install && npm publish && git add . && git commit -m 'publish'",
9
+ "publish-minor": "rm -rf dist; npm run tsc && npx eslint . && npm run preprepare && npm version minor && npm install && npm publish && git add . && git commit -m 'publish'",
10
+ "publish-patch": "rm -rf dist; npm run tsc && npx eslint . && npm run preprepare && npm version patch && npm install && npm publish && git add . && git commit -m 'publish'"
11
+ },
12
+ "main": "dist/index.mjs",
13
+ "types": "dist/index.d.mjs",
14
+ "type": "module",
15
+ "author": "Pete Morris",
16
+ "license": "ISC",
17
+ "devDependencies": {
18
+ "@stylistic/eslint-plugin-ts": "^2.10.1",
19
+ "eslint-plugin-import": "^2.31.0",
20
+ "eslint-plugin-prefer-arrow-functions": "^3.4.1",
21
+ "typescript": "^5.6.3",
22
+ "typescript-eslint": "^8.14.0"
23
+ },
24
+ "files": [
25
+ "dist/**/*"
26
+ ],
27
+ "dependencies": {
28
+ "tscommons-esm-ai": "^0.0.2",
29
+ "tscommons-esm-core": "^0.0.2"
30
+ }
31
+ }