@prosopo/datasets-fs 0.2.7 → 0.2.9

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.
Files changed (230) hide show
  1. package/README.md +21 -0
  2. package/dist/cjs/cli/cli.cjs +55 -0
  3. package/dist/cjs/index.cjs +3 -1
  4. package/dist/cli/cli.d.ts +9 -0
  5. package/dist/cli/cli.d.ts.map +1 -0
  6. package/dist/cli/cli.js +54 -0
  7. package/dist/cli/cli.js.map +1 -0
  8. package/dist/cli/cliCommand.d.ts +17 -0
  9. package/dist/cli/cliCommand.d.ts.map +1 -0
  10. package/dist/cli/cliCommand.js +36 -0
  11. package/dist/cli/cliCommand.js.map +1 -0
  12. package/dist/cli/cliCommandComposite.d.ts +14 -0
  13. package/dist/cli/cliCommandComposite.d.ts.map +1 -0
  14. package/dist/cli/cliCommandComposite.js +34 -0
  15. package/dist/cli/cliCommandComposite.js.map +1 -0
  16. package/dist/cli.js +21 -35
  17. package/dist/cli.js.map +1 -1
  18. package/dist/commands/flatten.d.ts +56 -0
  19. package/dist/commands/flatten.d.ts.map +1 -0
  20. package/dist/commands/flatten.js +103 -0
  21. package/dist/commands/flatten.js.map +1 -0
  22. package/dist/commands/generate.d.ts +114 -0
  23. package/dist/commands/generate.d.ts.map +1 -0
  24. package/dist/commands/generate.js +151 -0
  25. package/dist/commands/generate.js.map +1 -0
  26. package/dist/commands/generateV1.d.ts +174 -0
  27. package/dist/commands/generateV1.d.ts.map +1 -0
  28. package/dist/commands/generateV1.js +178 -0
  29. package/dist/commands/generateV1.js.map +1 -0
  30. package/dist/commands/generateV2.d.ts +184 -0
  31. package/dist/commands/generateV2.d.ts.map +1 -0
  32. package/dist/commands/generateV2.js +204 -0
  33. package/dist/commands/generateV2.js.map +1 -0
  34. package/dist/commands/get.d.ts +35 -0
  35. package/dist/commands/get.d.ts.map +1 -0
  36. package/dist/commands/get.js +81 -0
  37. package/dist/commands/get.js.map +1 -0
  38. package/dist/commands/labels.d.ts +46 -0
  39. package/dist/commands/labels.d.ts.map +1 -0
  40. package/dist/commands/labels.js +43 -0
  41. package/dist/commands/labels.js.map +1 -0
  42. package/dist/commands/relocate.d.ts +68 -0
  43. package/dist/commands/relocate.d.ts.map +1 -0
  44. package/dist/commands/relocate.js +75 -0
  45. package/dist/commands/relocate.js.map +1 -0
  46. package/dist/commands/resize.d.ts +66 -0
  47. package/dist/commands/resize.d.ts.map +1 -0
  48. package/dist/commands/resize.js +118 -0
  49. package/dist/commands/resize.js.map +1 -0
  50. package/dist/{generate/distinct/dummy.d.ts.map → dummy.d.ts.map} +1 -1
  51. package/dist/dummy.js.map +1 -0
  52. package/dist/index.d.ts +1 -1
  53. package/dist/index.d.ts.map +1 -1
  54. package/dist/index.js +1 -1
  55. package/dist/index.js.map +1 -1
  56. package/dist/tests/data/flat_resized/labels.json +3 -0
  57. package/dist/tests/data/flat_resized/relocated_data.json +364 -0
  58. package/dist/tests/mocked.test.d.ts +2 -0
  59. package/dist/tests/mocked.test.d.ts.map +1 -0
  60. package/dist/tests/mocked.test.js +271 -0
  61. package/dist/tests/mocked.test.js.map +1 -0
  62. package/dist/tests/utils.d.ts +35 -0
  63. package/dist/tests/utils.d.ts.map +1 -0
  64. package/dist/tests/utils.js +120 -0
  65. package/dist/tests/utils.js.map +1 -0
  66. package/dist/utils/input.d.ts +24 -0
  67. package/dist/utils/input.d.ts.map +1 -0
  68. package/dist/utils/input.js +34 -0
  69. package/dist/utils/input.js.map +1 -0
  70. package/dist/utils/inputOutput.d.ts +20 -0
  71. package/dist/utils/inputOutput.d.ts.map +1 -0
  72. package/dist/utils/inputOutput.js +10 -0
  73. package/dist/utils/inputOutput.js.map +1 -0
  74. package/dist/utils/output.d.ts +37 -0
  75. package/dist/utils/output.d.ts.map +1 -0
  76. package/dist/utils/output.js +63 -0
  77. package/dist/utils/output.js.map +1 -0
  78. package/package.json +5 -6
  79. package/dist/cjs/cli.cjs +0 -34
  80. package/dist/cjs/flatten/args.cjs +0 -9
  81. package/dist/cjs/flatten/cli.cjs +0 -28
  82. package/dist/cjs/flatten/flatten.cjs +0 -55
  83. package/dist/cjs/generate/args.cjs +0 -16
  84. package/dist/cjs/generate/cli.cjs +0 -50
  85. package/dist/cjs/generate/distinct/args.cjs +0 -11
  86. package/dist/cjs/generate/distinct/cli.cjs +0 -28
  87. package/dist/cjs/generate/distinct/generate.cjs +0 -174
  88. package/dist/cjs/generate/union/args.cjs +0 -12
  89. package/dist/cjs/generate/union/cli.cjs +0 -31
  90. package/dist/cjs/generate/union/generate.cjs +0 -151
  91. package/dist/cjs/generate/util.cjs +0 -21
  92. package/dist/cjs/get/args.cjs +0 -7
  93. package/dist/cjs/get/cli.cjs +0 -20
  94. package/dist/cjs/get/get.cjs +0 -53
  95. package/dist/cjs/labels/args.cjs +0 -7
  96. package/dist/cjs/labels/cli.cjs +0 -20
  97. package/dist/cjs/labels/labels.cjs +0 -21
  98. package/dist/cjs/relocate/args.cjs +0 -9
  99. package/dist/cjs/relocate/cli.cjs +0 -27
  100. package/dist/cjs/relocate/relocate.cjs +0 -36
  101. package/dist/cjs/scale/args.cjs +0 -11
  102. package/dist/cjs/scale/cli.cjs +0 -34
  103. package/dist/cjs/scale/scale.cjs +0 -55
  104. package/dist/flatten/args.d.ts +0 -16
  105. package/dist/flatten/args.d.ts.map +0 -1
  106. package/dist/flatten/args.js +0 -8
  107. package/dist/flatten/args.js.map +0 -1
  108. package/dist/flatten/cli.d.ts +0 -18
  109. package/dist/flatten/cli.d.ts.map +0 -1
  110. package/dist/flatten/cli.js +0 -30
  111. package/dist/flatten/cli.js.map +0 -1
  112. package/dist/flatten/flatten.d.ts +0 -5
  113. package/dist/flatten/flatten.d.ts.map +0 -1
  114. package/dist/flatten/flatten.js +0 -65
  115. package/dist/flatten/flatten.js.map +0 -1
  116. package/dist/flatten/index.d.ts +0 -4
  117. package/dist/flatten/index.d.ts.map +0 -1
  118. package/dist/flatten/index.js +0 -4
  119. package/dist/flatten/index.js.map +0 -1
  120. package/dist/generate/args.d.ts +0 -37
  121. package/dist/generate/args.d.ts.map +0 -1
  122. package/dist/generate/args.js +0 -15
  123. package/dist/generate/args.js.map +0 -1
  124. package/dist/generate/cli.d.ts +0 -32
  125. package/dist/generate/cli.d.ts.map +0 -1
  126. package/dist/generate/cli.js +0 -62
  127. package/dist/generate/cli.js.map +0 -1
  128. package/dist/generate/distinct/args.d.ts +0 -49
  129. package/dist/generate/distinct/args.d.ts.map +0 -1
  130. package/dist/generate/distinct/args.js +0 -10
  131. package/dist/generate/distinct/args.js.map +0 -1
  132. package/dist/generate/distinct/cli.d.ts +0 -20
  133. package/dist/generate/distinct/cli.d.ts.map +0 -1
  134. package/dist/generate/distinct/cli.js +0 -31
  135. package/dist/generate/distinct/cli.js.map +0 -1
  136. package/dist/generate/distinct/dummy.js.map +0 -1
  137. package/dist/generate/distinct/generate.d.ts +0 -5
  138. package/dist/generate/distinct/generate.d.ts.map +0 -1
  139. package/dist/generate/distinct/generate.js +0 -186
  140. package/dist/generate/distinct/generate.js.map +0 -1
  141. package/dist/generate/distinct/index.d.ts +0 -4
  142. package/dist/generate/distinct/index.d.ts.map +0 -1
  143. package/dist/generate/distinct/index.js +0 -4
  144. package/dist/generate/distinct/index.js.map +0 -1
  145. package/dist/generate/index.d.ts +0 -5
  146. package/dist/generate/index.d.ts.map +0 -1
  147. package/dist/generate/index.js +0 -5
  148. package/dist/generate/index.js.map +0 -1
  149. package/dist/generate/union/args.d.ts +0 -52
  150. package/dist/generate/union/args.d.ts.map +0 -1
  151. package/dist/generate/union/args.js +0 -11
  152. package/dist/generate/union/args.js.map +0 -1
  153. package/dist/generate/union/cli.d.ts +0 -22
  154. package/dist/generate/union/cli.d.ts.map +0 -1
  155. package/dist/generate/union/cli.js +0 -35
  156. package/dist/generate/union/cli.js.map +0 -1
  157. package/dist/generate/union/generate.d.ts +0 -5
  158. package/dist/generate/union/generate.d.ts.map +0 -1
  159. package/dist/generate/union/generate.js +0 -168
  160. package/dist/generate/union/generate.js.map +0 -1
  161. package/dist/generate/union/index.d.ts +0 -4
  162. package/dist/generate/union/index.d.ts.map +0 -1
  163. package/dist/generate/union/index.js +0 -4
  164. package/dist/generate/union/index.js.map +0 -1
  165. package/dist/generate/util.d.ts +0 -6
  166. package/dist/generate/util.d.ts.map +0 -1
  167. package/dist/generate/util.js +0 -20
  168. package/dist/generate/util.js.map +0 -1
  169. package/dist/get/args.d.ts +0 -10
  170. package/dist/get/args.d.ts.map +0 -1
  171. package/dist/get/args.js +0 -6
  172. package/dist/get/args.js.map +0 -1
  173. package/dist/get/cli.d.ts +0 -14
  174. package/dist/get/cli.d.ts.map +0 -1
  175. package/dist/get/cli.js +0 -19
  176. package/dist/get/cli.js.map +0 -1
  177. package/dist/get/get.d.ts +0 -5
  178. package/dist/get/get.d.ts.map +0 -1
  179. package/dist/get/get.js +0 -60
  180. package/dist/get/get.js.map +0 -1
  181. package/dist/get/index.d.ts +0 -4
  182. package/dist/get/index.d.ts.map +0 -1
  183. package/dist/get/index.js +0 -4
  184. package/dist/get/index.js.map +0 -1
  185. package/dist/labels/args.d.ts +0 -10
  186. package/dist/labels/args.d.ts.map +0 -1
  187. package/dist/labels/args.js +0 -6
  188. package/dist/labels/args.js.map +0 -1
  189. package/dist/labels/cli.d.ts +0 -14
  190. package/dist/labels/cli.d.ts.map +0 -1
  191. package/dist/labels/cli.js +0 -19
  192. package/dist/labels/cli.js.map +0 -1
  193. package/dist/labels/index.d.ts +0 -4
  194. package/dist/labels/index.d.ts.map +0 -1
  195. package/dist/labels/index.js +0 -4
  196. package/dist/labels/index.js.map +0 -1
  197. package/dist/labels/labels.d.ts +0 -5
  198. package/dist/labels/labels.d.ts.map +0 -1
  199. package/dist/labels/labels.js +0 -22
  200. package/dist/labels/labels.js.map +0 -1
  201. package/dist/relocate/args.d.ts +0 -16
  202. package/dist/relocate/args.d.ts.map +0 -1
  203. package/dist/relocate/args.js +0 -8
  204. package/dist/relocate/args.js.map +0 -1
  205. package/dist/relocate/cli.d.ts +0 -18
  206. package/dist/relocate/cli.d.ts.map +0 -1
  207. package/dist/relocate/cli.js +0 -29
  208. package/dist/relocate/cli.js.map +0 -1
  209. package/dist/relocate/relocate.d.ts +0 -5
  210. package/dist/relocate/relocate.d.ts.map +0 -1
  211. package/dist/relocate/relocate.js +0 -40
  212. package/dist/relocate/relocate.js.map +0 -1
  213. package/dist/scale/args.d.ts +0 -22
  214. package/dist/scale/args.d.ts.map +0 -1
  215. package/dist/scale/args.js +0 -10
  216. package/dist/scale/args.js.map +0 -1
  217. package/dist/scale/cli.d.ts +0 -22
  218. package/dist/scale/cli.d.ts.map +0 -1
  219. package/dist/scale/cli.js +0 -38
  220. package/dist/scale/cli.js.map +0 -1
  221. package/dist/scale/index.d.ts +0 -4
  222. package/dist/scale/index.d.ts.map +0 -1
  223. package/dist/scale/index.js +0 -4
  224. package/dist/scale/index.js.map +0 -1
  225. package/dist/scale/scale.d.ts +0 -5
  226. package/dist/scale/scale.d.ts.map +0 -1
  227. package/dist/scale/scale.js +0 -67
  228. package/dist/scale/scale.js.map +0 -1
  229. /package/dist/{generate/distinct/dummy.d.ts → dummy.d.ts} +0 -0
  230. /package/dist/{generate/distinct/dummy.js → dummy.js} +0 -0
@@ -0,0 +1,114 @@
1
+ /// <reference types="yargs" />
2
+ import { Item, LabelledItem } from '@prosopo/types';
3
+ import { OutputCliCommand } from '../utils/output.js';
4
+ import { z } from 'zod';
5
+ export declare const ArgsSchema: z.ZodObject<{
6
+ output: z.ZodString;
7
+ labels: z.ZodOptional<z.ZodString>;
8
+ labelled: z.ZodOptional<z.ZodString>;
9
+ unlabelled: z.ZodOptional<z.ZodString>;
10
+ seed: z.ZodNumber;
11
+ size: z.ZodOptional<z.ZodNumber>;
12
+ overwrite: z.ZodOptional<z.ZodBoolean>;
13
+ allowDuplicates: z.ZodOptional<z.ZodBoolean>;
14
+ allowDuplicatesLabelled: z.ZodOptional<z.ZodBoolean>;
15
+ allowDuplicatesUnlabelled: z.ZodOptional<z.ZodBoolean>;
16
+ }, "strip", z.ZodTypeAny, {
17
+ output: string;
18
+ seed: number;
19
+ labels?: string | undefined;
20
+ labelled?: string | undefined;
21
+ unlabelled?: string | undefined;
22
+ size?: number | undefined;
23
+ overwrite?: boolean | undefined;
24
+ allowDuplicates?: boolean | undefined;
25
+ allowDuplicatesLabelled?: boolean | undefined;
26
+ allowDuplicatesUnlabelled?: boolean | undefined;
27
+ }, {
28
+ output: string;
29
+ seed: number;
30
+ labels?: string | undefined;
31
+ labelled?: string | undefined;
32
+ unlabelled?: string | undefined;
33
+ size?: number | undefined;
34
+ overwrite?: boolean | undefined;
35
+ allowDuplicates?: boolean | undefined;
36
+ allowDuplicatesLabelled?: boolean | undefined;
37
+ allowDuplicatesUnlabelled?: boolean | undefined;
38
+ }>;
39
+ export type ArgsSchemaType = typeof ArgsSchema;
40
+ export type Args = z.infer<ArgsSchemaType>;
41
+ export declare abstract class Generate<T extends ArgsSchemaType> extends OutputCliCommand<T> {
42
+ getOptions(): {
43
+ [key: string]: import("yargs").Options;
44
+ } & {
45
+ output: {
46
+ alias: string;
47
+ string: boolean;
48
+ demand: boolean;
49
+ description: string;
50
+ };
51
+ overwrite: {
52
+ boolean: boolean;
53
+ description: string;
54
+ };
55
+ } & {
56
+ output: {
57
+ description: string;
58
+ };
59
+ labelled: {
60
+ string: boolean;
61
+ demand: boolean;
62
+ description: string;
63
+ };
64
+ unlabelled: {
65
+ string: boolean;
66
+ demand: boolean;
67
+ description: string;
68
+ };
69
+ seed: {
70
+ number: boolean;
71
+ demand: boolean;
72
+ description: string;
73
+ };
74
+ size: {
75
+ number: boolean;
76
+ description: string;
77
+ };
78
+ labels: {
79
+ string: boolean;
80
+ description: string;
81
+ };
82
+ allowDuplicates: {
83
+ boolean: boolean;
84
+ description: string;
85
+ };
86
+ allowDuplicatesLabelled: {
87
+ boolean: boolean;
88
+ description: string;
89
+ };
90
+ allowDuplicatesUnlabelled: {
91
+ boolean: boolean;
92
+ description: string;
93
+ };
94
+ };
95
+ _check(args: Args): Promise<void>;
96
+ labelled: LabelledItem[];
97
+ unlabelled: Item[];
98
+ labels: string[];
99
+ labelledMapFile: string;
100
+ unlabelledMapFile: string;
101
+ labelToImages: {
102
+ [label: string]: Item[];
103
+ };
104
+ targets: string[];
105
+ saltRounds: number;
106
+ private loadData;
107
+ private loadLabels;
108
+ _run(args: Args): Promise<void>;
109
+ }
110
+ export declare const checkDuplicates: (labelled: LabelledItem[], unlabelled: Item[], options: {
111
+ allowDuplicatesLabelled?: boolean;
112
+ allowDuplicatesUnlabelled?: boolean;
113
+ }) => void;
114
+ //# sourceMappingURL=generate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../src/commands/generate.ts"],"names":[],"mappings":";AAAA,OAAO,EAAc,IAAI,EAAsB,YAAY,EAAyB,MAAM,gBAAgB,CAAA;AAC1G,OAAO,EAAoB,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AAGvE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAGvB,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAUrB,CAAA;AACF,MAAM,MAAM,cAAc,GAAG,OAAO,UAAU,CAAA;AAC9C,MAAM,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,CAAA;AAE1C,8BAAsB,QAAQ,CAAC,CAAC,SAAS,cAAc,CAAE,SAAQ,gBAAgB,CAAC,CAAC,CAAC;IAChE,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IA4CJ,MAAM,CAAC,IAAI,EAAE,IAAI;IAoBvC,QAAQ,EAAE,YAAY,EAAE,CAAK;IAC7B,UAAU,EAAE,IAAI,EAAE,CAAK;IACvB,MAAM,EAAE,MAAM,EAAE,CAAK;IACrB,eAAe,SAAK;IACpB,iBAAiB,SAAK;IACtB,aAAa,EAAE;QAAE,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,EAAE,CAAA;KAAE,CAAK;IAC/C,OAAO,EAAE,MAAM,EAAE,CAAK;IACtB,UAAU,SAAK;IAEf,OAAO,CAAC,QAAQ;IA4BhB,OAAO,CAAC,UAAU;IAeI,IAAI,CAAC,IAAI,EAAE,IAAI;CAWxC;AAED,eAAO,MAAM,eAAe,aACd,YAAY,EAAE,cACZ,IAAI,EAAE,WACT;IACL,uBAAuB,CAAC,EAAE,OAAO,CAAA;IACjC,yBAAyB,CAAC,EAAE,OAAO,CAAA;CACtC,SAMJ,CAAA"}
@@ -0,0 +1,151 @@
1
+ import { DataSchema, LabelledDataSchema, LabelsContainerSchema } from '@prosopo/types';
2
+ import { OutputArgsSchema, OutputCliCommand } from '../utils/output.js';
3
+ import { ProsopoEnvError } from '@prosopo/common';
4
+ import { lodash, setSeedGlobal } from '@prosopo/util';
5
+ import { z } from 'zod';
6
+ import fs from 'fs';
7
+ export const ArgsSchema = OutputArgsSchema.extend({
8
+ labels: z.string().optional(),
9
+ labelled: z.string().optional(),
10
+ unlabelled: z.string().optional(),
11
+ seed: z.number(),
12
+ size: z.number().optional(),
13
+ overwrite: z.boolean().optional(),
14
+ allowDuplicates: z.boolean().optional(),
15
+ allowDuplicatesLabelled: z.boolean().optional(),
16
+ allowDuplicatesUnlabelled: z.boolean().optional(),
17
+ });
18
+ export class Generate extends OutputCliCommand {
19
+ constructor() {
20
+ super(...arguments);
21
+ this.labelled = [];
22
+ this.unlabelled = [];
23
+ this.labels = [];
24
+ this.labelledMapFile = '';
25
+ this.unlabelledMapFile = '';
26
+ this.labelToImages = {};
27
+ this.targets = [];
28
+ this.saltRounds = 10;
29
+ }
30
+ getOptions() {
31
+ return lodash().merge(super.getOptions(), {
32
+ output: {
33
+ description: 'Where to write the captchas JSON file',
34
+ },
35
+ labelled: {
36
+ string: true,
37
+ demand: true,
38
+ description: 'Path to JSON file containing labelled data',
39
+ },
40
+ unlabelled: {
41
+ string: true,
42
+ demand: true,
43
+ description: 'Path to JSON file containing unlabelled data',
44
+ },
45
+ seed: {
46
+ number: true,
47
+ demand: true,
48
+ description: 'Seed for random number generator',
49
+ },
50
+ size: {
51
+ number: true,
52
+ description: 'Number of images in each captcha',
53
+ },
54
+ labels: {
55
+ string: true,
56
+ description: 'Path to JSON file containing labels which unlabelled data will be assigned to. If not given, labels will be deduced from the labelled data.',
57
+ },
58
+ allowDuplicates: {
59
+ boolean: true,
60
+ description: 'If true, allow duplicates in the data (labelled and unlabelled)',
61
+ },
62
+ allowDuplicatesLabelled: {
63
+ boolean: true,
64
+ description: 'If true, allow duplicates in the labelled data',
65
+ },
66
+ allowDuplicatesUnlabelled: {
67
+ boolean: true,
68
+ description: 'If true, allow duplicates in the unlabelled data',
69
+ },
70
+ });
71
+ }
72
+ async _check(args) {
73
+ // if specified, check files exist
74
+ const labelledMapFile = args.labelled;
75
+ if (labelledMapFile && !fs.existsSync(labelledMapFile)) {
76
+ throw new ProsopoEnvError(new Error(`labelled map file does not exist: ${labelledMapFile}`), 'FS.FILE_NOT_FOUND');
77
+ }
78
+ const unlabelledMapFile = args.unlabelled;
79
+ if (unlabelledMapFile && !fs.existsSync(unlabelledMapFile)) {
80
+ throw new ProsopoEnvError(new Error(`unlabelled map file does not exist: ${unlabelledMapFile}`), 'FS.FILE_NOT_FOUND');
81
+ }
82
+ this.labelledMapFile = labelledMapFile || '';
83
+ this.unlabelledMapFile = unlabelledMapFile || '';
84
+ }
85
+ loadData(args) {
86
+ const allowDuplicatesLabelled = args.allowDuplicatesLabelled || args.allowDuplicates || false;
87
+ const allowDuplicatesUnlabelled = args.allowDuplicatesUnlabelled || args.allowDuplicates || false;
88
+ // load the map to get the labelled and unlabelled data
89
+ this.labelled = this.labelledMapFile
90
+ ? LabelledDataSchema.parse(JSON.parse(fs.readFileSync(this.labelledMapFile, 'utf8'))).items
91
+ : [];
92
+ this.unlabelled = this.unlabelledMapFile
93
+ ? DataSchema.parse(JSON.parse(fs.readFileSync(this.unlabelledMapFile, 'utf8'))).items
94
+ : [];
95
+ // check for duplicates
96
+ checkDuplicates(this.labelled, this.unlabelled, {
97
+ allowDuplicatesLabelled,
98
+ allowDuplicatesUnlabelled,
99
+ });
100
+ // split the labelled data by label
101
+ this.labelToImages = {};
102
+ for (const entry of this.labelled) {
103
+ const arr = this.labelToImages[entry.label] || [];
104
+ arr.push(entry);
105
+ this.labelToImages[entry.label] = arr;
106
+ }
107
+ this.targets = Object.keys(this.labelToImages);
108
+ }
109
+ loadLabels(args) {
110
+ // load the labels from file
111
+ // these are the labels that unlabelled data will be assigned to
112
+ // note that these can be different to the labels in the map file as the labelled data is independent of the unlabelled data in terms of labels
113
+ this.labels = [];
114
+ if (args.labels && fs.existsSync(args.labels)) {
115
+ this.labels.push(...[...LabelsContainerSchema.parse(JSON.parse(fs.readFileSync(args.labels, 'utf8'))).labels]);
116
+ }
117
+ else {
118
+ // else default to the labels in the labelled data
119
+ this.labels.push(...[...this.targets]);
120
+ }
121
+ }
122
+ async _run(args) {
123
+ await super._run(args);
124
+ // set the seed
125
+ setSeedGlobal(args.seed || 0);
126
+ // get lodash (with seeded rng)
127
+ const _ = lodash();
128
+ this.loadData(args);
129
+ this.loadLabels(args);
130
+ }
131
+ }
132
+ export const checkDuplicates = (labelled, unlabelled, options) => {
133
+ // check for duplicates
134
+ const all = new Set();
135
+ if (!options.allowDuplicatesLabelled)
136
+ addAllUnique(all, labelled, 'labelled');
137
+ if (!options.allowDuplicatesUnlabelled)
138
+ addAllUnique(all, unlabelled, 'unlabelled');
139
+ };
140
+ const addAllUnique = (all, entries, dataType) => {
141
+ for (const entry of entries) {
142
+ addUnique(all, entry, dataType);
143
+ }
144
+ };
145
+ const addUnique = (all, entry, dataType) => {
146
+ if (all.has(entry.data)) {
147
+ throw new Error(`Duplicate data entry in ${dataType} data: ${JSON.stringify(entry)}`);
148
+ }
149
+ all.add(entry.data);
150
+ };
151
+ //# sourceMappingURL=generate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/commands/generate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,174 @@
1
+ /// <reference types="yargs" />
2
+ import { Generate } from './generate.js';
3
+ import { z } from 'zod';
4
+ export declare const ArgsSchema: z.ZodObject<{
5
+ output: z.ZodString;
6
+ overwrite: z.ZodOptional<z.ZodBoolean>;
7
+ allowDuplicates: z.ZodOptional<z.ZodBoolean>;
8
+ labels: z.ZodOptional<z.ZodString>;
9
+ labelled: z.ZodOptional<z.ZodString>;
10
+ unlabelled: z.ZodOptional<z.ZodString>;
11
+ seed: z.ZodNumber;
12
+ size: z.ZodOptional<z.ZodNumber>;
13
+ allowDuplicatesLabelled: z.ZodOptional<z.ZodBoolean>;
14
+ allowDuplicatesUnlabelled: z.ZodOptional<z.ZodBoolean>;
15
+ solved: z.ZodOptional<z.ZodNumber>;
16
+ unsolved: z.ZodOptional<z.ZodNumber>;
17
+ minCorrect: z.ZodOptional<z.ZodNumber>;
18
+ maxCorrect: z.ZodOptional<z.ZodNumber>;
19
+ }, "strip", z.ZodTypeAny, {
20
+ output: string;
21
+ seed: number;
22
+ overwrite?: boolean | undefined;
23
+ allowDuplicates?: boolean | undefined;
24
+ labels?: string | undefined;
25
+ labelled?: string | undefined;
26
+ unlabelled?: string | undefined;
27
+ size?: number | undefined;
28
+ allowDuplicatesLabelled?: boolean | undefined;
29
+ allowDuplicatesUnlabelled?: boolean | undefined;
30
+ solved?: number | undefined;
31
+ unsolved?: number | undefined;
32
+ minCorrect?: number | undefined;
33
+ maxCorrect?: number | undefined;
34
+ }, {
35
+ output: string;
36
+ seed: number;
37
+ overwrite?: boolean | undefined;
38
+ allowDuplicates?: boolean | undefined;
39
+ labels?: string | undefined;
40
+ labelled?: string | undefined;
41
+ unlabelled?: string | undefined;
42
+ size?: number | undefined;
43
+ allowDuplicatesLabelled?: boolean | undefined;
44
+ allowDuplicatesUnlabelled?: boolean | undefined;
45
+ solved?: number | undefined;
46
+ unsolved?: number | undefined;
47
+ minCorrect?: number | undefined;
48
+ maxCorrect?: number | undefined;
49
+ }>;
50
+ export type ArgsSchemaType = typeof ArgsSchema;
51
+ export type Args = z.infer<ArgsSchemaType>;
52
+ export declare class GenerateV1 extends Generate<ArgsSchemaType> {
53
+ getArgSchema(): z.ZodObject<{
54
+ output: z.ZodString;
55
+ overwrite: z.ZodOptional<z.ZodBoolean>;
56
+ allowDuplicates: z.ZodOptional<z.ZodBoolean>;
57
+ labels: z.ZodOptional<z.ZodString>;
58
+ labelled: z.ZodOptional<z.ZodString>;
59
+ unlabelled: z.ZodOptional<z.ZodString>;
60
+ seed: z.ZodNumber;
61
+ size: z.ZodOptional<z.ZodNumber>;
62
+ allowDuplicatesLabelled: z.ZodOptional<z.ZodBoolean>;
63
+ allowDuplicatesUnlabelled: z.ZodOptional<z.ZodBoolean>;
64
+ solved: z.ZodOptional<z.ZodNumber>;
65
+ unsolved: z.ZodOptional<z.ZodNumber>;
66
+ minCorrect: z.ZodOptional<z.ZodNumber>;
67
+ maxCorrect: z.ZodOptional<z.ZodNumber>;
68
+ }, "strip", z.ZodTypeAny, {
69
+ output: string;
70
+ seed: number;
71
+ overwrite?: boolean | undefined;
72
+ allowDuplicates?: boolean | undefined;
73
+ labels?: string | undefined;
74
+ labelled?: string | undefined;
75
+ unlabelled?: string | undefined;
76
+ size?: number | undefined;
77
+ allowDuplicatesLabelled?: boolean | undefined;
78
+ allowDuplicatesUnlabelled?: boolean | undefined;
79
+ solved?: number | undefined;
80
+ unsolved?: number | undefined;
81
+ minCorrect?: number | undefined;
82
+ maxCorrect?: number | undefined;
83
+ }, {
84
+ output: string;
85
+ seed: number;
86
+ overwrite?: boolean | undefined;
87
+ allowDuplicates?: boolean | undefined;
88
+ labels?: string | undefined;
89
+ labelled?: string | undefined;
90
+ unlabelled?: string | undefined;
91
+ size?: number | undefined;
92
+ allowDuplicatesLabelled?: boolean | undefined;
93
+ allowDuplicatesUnlabelled?: boolean | undefined;
94
+ solved?: number | undefined;
95
+ unsolved?: number | undefined;
96
+ minCorrect?: number | undefined;
97
+ maxCorrect?: number | undefined;
98
+ }>;
99
+ getDescription(): string;
100
+ getOptions(): {
101
+ [key: string]: import("yargs").Options;
102
+ } & {
103
+ output: {
104
+ alias: string;
105
+ string: boolean;
106
+ demand: boolean;
107
+ description: string;
108
+ };
109
+ overwrite: {
110
+ boolean: boolean;
111
+ description: string;
112
+ };
113
+ } & {
114
+ output: {
115
+ description: string;
116
+ };
117
+ labelled: {
118
+ string: boolean;
119
+ demand: boolean;
120
+ description: string;
121
+ };
122
+ unlabelled: {
123
+ string: boolean;
124
+ demand: boolean;
125
+ description: string;
126
+ };
127
+ seed: {
128
+ number: boolean;
129
+ demand: boolean;
130
+ description: string;
131
+ };
132
+ size: {
133
+ number: boolean;
134
+ description: string;
135
+ };
136
+ labels: {
137
+ string: boolean;
138
+ description: string;
139
+ };
140
+ allowDuplicates: {
141
+ boolean: boolean;
142
+ description: string;
143
+ };
144
+ allowDuplicatesLabelled: {
145
+ boolean: boolean;
146
+ description: string;
147
+ };
148
+ allowDuplicatesUnlabelled: {
149
+ boolean: boolean;
150
+ description: string;
151
+ };
152
+ } & {
153
+ solved: {
154
+ description: string;
155
+ number: boolean;
156
+ };
157
+ unsolved: {
158
+ description: string;
159
+ number: boolean;
160
+ };
161
+ minCorrect: {
162
+ description: string;
163
+ number: boolean;
164
+ };
165
+ maxCorrect: {
166
+ description: string;
167
+ number: boolean;
168
+ };
169
+ };
170
+ private generateSolved;
171
+ private generateUnsolved;
172
+ _run(args: Args): Promise<void>;
173
+ }
174
+ //# sourceMappingURL=generateV1.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generateV1.d.ts","sourceRoot":"","sources":["../../src/commands/generateV1.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,QAAQ,EAAoC,MAAM,eAAe,CAAA;AAI1E,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAKvB,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAKrB,CAAA;AACF,MAAM,MAAM,cAAc,GAAG,OAAO,UAAU,CAAA;AAC9C,MAAM,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,CAAA;AAE1C,qBAAa,UAAW,SAAQ,QAAQ,CAAC,cAAc,CAAC;IACpC,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAIZ,cAAc,IAAI,MAAM;IAIxB,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAqB1B,OAAO,CAAC,cAAc;IA0FtB,OAAO,CAAC,gBAAgB;IA+CF,IAAI,CAAC,IAAI,EAAE,IAAI;CAkCxC"}
@@ -0,0 +1,178 @@
1
+ import { CaptchaTypes, CaptchasContainerSchema } from '@prosopo/types';
2
+ import { Generate, ArgsSchema as GenerateArgsSchema } from './generate.js';
3
+ import { ProsopoEnvError } from '@prosopo/common';
4
+ import { at, get, lodash } from '@prosopo/util';
5
+ import { blake2AsHex } from '@polkadot/util-crypto';
6
+ import { z } from 'zod';
7
+ import bcrypt from 'bcrypt';
8
+ import cliProgress from 'cli-progress';
9
+ import fs from 'fs';
10
+ export const ArgsSchema = GenerateArgsSchema.extend({
11
+ solved: z.number().optional(),
12
+ unsolved: z.number().optional(),
13
+ minCorrect: z.number().optional(),
14
+ maxCorrect: z.number().optional(),
15
+ });
16
+ export class GenerateV1 extends Generate {
17
+ getArgSchema() {
18
+ return ArgsSchema;
19
+ }
20
+ getDescription() {
21
+ return 'Generate distinct captchas producing captcha challenges comprising 2 rounds, one labelled and one unlabelled';
22
+ }
23
+ getOptions() {
24
+ return lodash().merge(super.getOptions(), {
25
+ solved: {
26
+ description: 'Number of captchas to generate that are solved',
27
+ number: true,
28
+ },
29
+ unsolved: {
30
+ description: 'Number of captchas to generate that are unsolved',
31
+ number: true,
32
+ },
33
+ minCorrect: {
34
+ description: 'Minimum number of target images in each captcha',
35
+ number: true,
36
+ },
37
+ maxCorrect: {
38
+ description: 'Maximum number of target images in each captcha',
39
+ number: true,
40
+ },
41
+ });
42
+ }
43
+ generateSolved(solved, size, minCorrect, maxCorrect, bar) {
44
+ const _ = lodash();
45
+ // generate n solved captchas
46
+ const solvedCaptchas = [];
47
+ for (let i = 0; i < solved; i++) {
48
+ // update the current value in your application..
49
+ bar.increment();
50
+ if (this.targets.length <= 1) {
51
+ throw new ProsopoEnvError(new Error(`not enough different labels in labelled data`), 'DATASET.NOT_ENOUGH_LABELS');
52
+ }
53
+ // uniformly sample targets
54
+ const target = at(this.targets, i % this.targets.length);
55
+ const notTargets = this.targets.filter((t) => t !== target);
56
+ // how many correct items should be in the captcha?
57
+ const nCorrect = _.random(minCorrect, maxCorrect);
58
+ // how many incorrect items should be in the captcha?
59
+ const nIncorrect = size - nCorrect;
60
+ const targetItems = get(this.labelToImages, target);
61
+ const notTargetItems = notTargets.map((notTarget) => get(this.labelToImages, notTarget)).flat();
62
+ if (targetItems.length < nCorrect) {
63
+ throw new ProsopoEnvError(new Error(`not enough images for target (${target})`), 'DATASET.NOT_ENOUGH_IMAGES');
64
+ }
65
+ if (notTargetItems.length < nIncorrect) {
66
+ throw new ProsopoEnvError(new Error(`not enough non-matching images for target (${target})`), 'DATASET.NOT_ENOUGH_IMAGES');
67
+ }
68
+ // get the correct items
69
+ const correctItems = _.sampleSize(targetItems, nCorrect);
70
+ // get the incorrect items
71
+ const incorrectItems = _.sampleSize(notTargetItems, nIncorrect);
72
+ let items = [...correctItems, ...incorrectItems];
73
+ let indices = [...Array(items.length).keys()];
74
+ indices = _.shuffle(indices);
75
+ items = indices.map((i) => at(items, i));
76
+ items = items.map((item) => {
77
+ return {
78
+ data: item.data,
79
+ hash: item.hash,
80
+ type: item.type,
81
+ };
82
+ });
83
+ // the first n indices are the correct items
84
+ const solution = indices
85
+ .map((index, i) => {
86
+ return {
87
+ pre: index,
88
+ post: i, // the index of the item in the shuffled array
89
+ };
90
+ })
91
+ .filter((item) => item.pre < correctItems.length) // keep all items that were in the first n slots of the original item array - these were the correct items
92
+ .map((item) => {
93
+ return item.post; // return the index in the shuffled array
94
+ });
95
+ const salt = blake2AsHex(bcrypt.genSaltSync(this.saltRounds));
96
+ // create the captcha
97
+ const captcha = {
98
+ salt,
99
+ target,
100
+ items,
101
+ solution,
102
+ };
103
+ solvedCaptchas.push(captcha);
104
+ }
105
+ return solvedCaptchas;
106
+ }
107
+ generateUnsolved(unsolved, size, bar) {
108
+ const _ = lodash();
109
+ // this.logger.info(`Generating ${unsolved} unsolved captchas...`)
110
+ // create a new progress bar instance and use shades_classic theme
111
+ // generate n unsolved captchas
112
+ const unsolvedCaptchas = [];
113
+ for (let i = 0; i < unsolved; i++) {
114
+ bar.increment();
115
+ if (this.unlabelled.length <= size) {
116
+ throw new ProsopoEnvError(new Error(`unlabelled map file does not contain enough data`), 'DATASET.NOT_ENOUGH_IMAGES');
117
+ }
118
+ // pick a random label to be the target
119
+ // note that these are potentially different to the labelled data labels
120
+ if (this.labels.length <= 0) {
121
+ throw new ProsopoEnvError(new Error(`no labels found for unlabelled data`), 'DATASET.NOT_ENOUGH_LABELS');
122
+ }
123
+ const index = _.random(0, this.labels.length - 1);
124
+ const target = at(this.labels, index);
125
+ // randomly pick images from the unlabelled data
126
+ const itemSet = _.sampleSize(this.unlabelled, size);
127
+ // shuffle the items
128
+ let items = [...itemSet];
129
+ let indices = [...Array(items.length).keys()];
130
+ indices = _.shuffle(indices);
131
+ items = indices.map((i) => at(items, i));
132
+ items = items.map((item) => {
133
+ return {
134
+ data: item.data,
135
+ hash: item.hash,
136
+ type: item.type,
137
+ };
138
+ });
139
+ const salt = blake2AsHex(bcrypt.genSaltSync(this.saltRounds));
140
+ // create the captcha
141
+ const captcha = {
142
+ salt,
143
+ target,
144
+ items,
145
+ };
146
+ unsolvedCaptchas.push(captcha);
147
+ }
148
+ return unsolvedCaptchas;
149
+ }
150
+ async _run(args) {
151
+ await super._run(args);
152
+ const outFile = args.output;
153
+ // get lodash (with seeded rng)
154
+ const _ = lodash();
155
+ const size = args.size || 9;
156
+ const minCorrect = args.minCorrect || 1;
157
+ const maxCorrect = args.maxCorrect || size - 1;
158
+ const solved = args.solved || 0;
159
+ const unsolved = args.unsolved || 0;
160
+ // create a new progress bar instance and use shades_classic theme
161
+ const bar = new cliProgress.SingleBar({}, cliProgress.Presets.shades_classic);
162
+ // this.logger.info(`Generating ${solved} solved captchas...`)
163
+ bar.start(solved + unsolved, 0);
164
+ const solvedCaptchas = this.generateSolved(solved, size, minCorrect, maxCorrect, bar);
165
+ const unsolvedCaptchas = this.generateUnsolved(unsolved, size, bar);
166
+ bar.stop();
167
+ // write to file
168
+ const output = {
169
+ captchas: [...solvedCaptchas, ...unsolvedCaptchas],
170
+ format: CaptchaTypes.SelectAll,
171
+ };
172
+ // verify the output
173
+ CaptchasContainerSchema.parse(output);
174
+ fs.mkdirSync(args.output.split('/').slice(0, -1).join('/'), { recursive: true });
175
+ fs.writeFileSync(outFile, JSON.stringify(output, null, 4));
176
+ }
177
+ }
178
+ //# sourceMappingURL=generateV1.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generateV1.js","sourceRoot":"","sources":["../../src/commands/generateV1.ts"],"names":[],"mappings":"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"}