keepset 0.25.0 → 0.27.0

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.
@@ -453,8 +453,21 @@ const CitationSchema = z.object({
453
453
  }).strict();
454
454
  /** A relative path inside an archive or a catalogue: `/`-separated segments, none empty, `.` or `..`, so it can never climb out of the directory it is resolved against. */
455
455
  const RelativePathSchema = z.string().refine((path) => path.split("/").every((segment) => segment !== "" && segment !== "." && segment !== ".."), { message: "must be a relative path of non-empty segments with no '.' or '..'" });
456
- /** Which file of an archive to read: a member path, matched against a member's whole path or its trailing segments (so `net.gml` finds `net/net.gml`), or the member whose name ends with one of a list of extensions (a format can have several, such as Pajek's `.net` and `.paj`). Either must match exactly one member when the recipe runs; macOS resource-fork members (`__MACOSX/` and `._` files) never match. */
457
- const ArchiveMemberSchema = z.union([z.object({ path: RelativePathSchema }).strict(), z.object({ extensions: z.array(z.string().regex(/^\.[A-Za-z0-9][A-Za-z0-9.]*$/, { message: "must be a file extension such as .mtx" })).min(1) }).strict()]);
456
+ /** A regular expression a member path must match in full, in JavaScript syntax; it must compile, so a recipe with a malformed pattern is refused when the entry is parsed and not when it runs. */
457
+ const MemberPatternSchema = z.string().min(1).refine((pattern) => {
458
+ try {
459
+ new RegExp(`^(?:${pattern})$`, "u");
460
+ return true;
461
+ } catch {
462
+ return false;
463
+ }
464
+ }, { message: "must be a valid regular expression" });
465
+ /** Which file of an archive to read: a member path, matched against a member's whole path or its trailing segments (so `net.gml` finds `net/net.gml`), the member whose name ends with one of a list of extensions (a format can have several, such as Pajek's `.net` and `.paj`), or the member whose whole path matches a regular expression (for an archive whose instance files cannot be told from its readmes and solutions by extension). A `member` selector must match exactly one member when the recipe runs, a `members` selector at least one; macOS resource-fork members (`__MACOSX/` and `._` files) never match. */
466
+ const ArchiveMemberSchema = z.union([
467
+ z.object({ path: RelativePathSchema }).strict(),
468
+ z.object({ extensions: z.array(z.string().regex(/^\.[A-Za-z0-9][A-Za-z0-9.]*$/, { message: "must be a file extension such as .mtx" })).min(1) }).strict(),
469
+ z.object({ pattern: MemberPatternSchema }).strict()
470
+ ]);
458
471
  /** The archive kinds that hold several files, from which a recipe selects one (`member`) or every one a selector matches (`members`). */
459
472
  const FileArchiveKindSchema = z.enum([
460
473
  "zip",
@@ -517,6 +530,10 @@ const ParserSchema = z.discriminatedUnion("format", [
517
530
  format: z.literal("pajek"),
518
531
  encoding: EncodingSchema
519
532
  }).strict(),
533
+ z.object({
534
+ format: z.literal("customer-points"),
535
+ encoding: EncodingSchema
536
+ }).strict(),
520
537
  z.object({
521
538
  format: z.literal("solomon"),
522
539
  encoding: EncodingSchema
@@ -529,6 +546,18 @@ const ParserSchema = z.discriminatedUnion("format", [
529
546
  format: z.literal("toptw"),
530
547
  encoding: EncodingSchema
531
548
  }).strict(),
549
+ z.object({
550
+ format: z.literal("tsplib"),
551
+ encoding: EncodingSchema
552
+ }).strict(),
553
+ z.object({
554
+ format: z.literal("verolog-2019"),
555
+ encoding: z.literal("utf-8")
556
+ }).strict(),
557
+ z.object({
558
+ format: z.literal("vrp-rep"),
559
+ encoding: z.literal("utf-8")
560
+ }).strict(),
532
561
  z.object({
533
562
  format: z.literal("csv-table"),
534
563
  encoding: EncodingSchema,
@@ -988,7 +1017,7 @@ var catalogue_default = {
988
1017
  "id": "keepset",
989
1018
  "name": "keepset",
990
1019
  "description": "The keepset catalogue: datasets with machine-readable recipes that fetch each one and normalise it into its category's target shape.",
991
- "version": "1.13.0",
1020
+ "version": "1.17.0",
992
1021
  "repository": "https://github.com/Mearman/keepset",
993
1022
  "namespaceAliases": {
994
1023
  "networkrepository": ["nr"],
@@ -7077,7 +7106,7 @@ var catalogue_default = {
7077
7106
  "citations": [],
7078
7107
  "recipe": {
7079
7108
  "status": "not-fetchable",
7080
- "reason": "The instances are keyword format text files of matrices (a collection of many, indexed by dataset.csv), and a collection is more than one or/v1 document, so no recipe reads it."
7109
+ "reason": "The instances are keyword format text files with node positions, time windows, service durations and a travel time matrix, but the repository holds them as a very large number of separate files in size directories and publishes no archive of the curated selection, so a recipe has no single download to read; the repository's own archive holds every instance and is several gigabytes."
7081
7110
  },
7082
7111
  "crosswalk": { "file": "crosswalks/or-v1/nodes.json" },
7083
7112
  "expectedCounts": {},
@@ -7095,20 +7124,153 @@ var catalogue_default = {
7095
7124
  "skills",
7096
7125
  "travelTime"
7097
7126
  ],
7098
- "category": "or/v1",
7127
+ "category": "or-set/v1",
7099
7128
  "sources": [{
7100
7129
  "url": "https://github.com/BasCoding/VeRoLog-2019",
7101
7130
  "retrieved": "2026-10-19",
7102
7131
  "status": "live"
7132
+ }, {
7133
+ "url": "https://codeload.github.com/BasCoding/VeRoLog-2019/zip/refs/heads/main",
7134
+ "retrieved": "2026-10-19",
7135
+ "status": "live"
7103
7136
  }],
7104
7137
  "licence": { "kind": "unrecorded" },
7105
7138
  "citations": [],
7106
7139
  "recipe": {
7107
- "status": "not-fetchable",
7108
- "reason": "The instances are keyword format text files in a collection mirrored by a student without a licence statement, and a collection is more than one or/v1 document, so no recipe reads it."
7140
+ "status": "fetchable",
7141
+ "source": 1,
7142
+ "archive": {
7143
+ "kind": "zip",
7144
+ "members": { "pattern": "VeRoLog-2019-main/All Instances/VSC2019_(?:EX\\d\\d|ORTEC_early_\\d\\d)\\.txt" }
7145
+ },
7146
+ "parser": {
7147
+ "format": "verolog-2019",
7148
+ "encoding": "utf-8"
7149
+ }
7109
7150
  },
7110
- "crosswalk": { "file": "crosswalks/or-v1/nodes.json" },
7111
- "expectedCounts": {},
7151
+ "crosswalk": {
7152
+ "source": "verolog-2019",
7153
+ "target": "or-set/v1",
7154
+ "rules": [
7155
+ {
7156
+ "op": "move",
7157
+ "from": "meta",
7158
+ "to": "meta"
7159
+ },
7160
+ {
7161
+ "op": "move",
7162
+ "from": "members[].id",
7163
+ "to": "instances[].id"
7164
+ },
7165
+ {
7166
+ "op": "move",
7167
+ "from": "members[].meta.dataset",
7168
+ "to": "instances[].meta.dataset"
7169
+ },
7170
+ {
7171
+ "op": "move",
7172
+ "from": "members[].meta.name",
7173
+ "to": "instances[].meta.name"
7174
+ },
7175
+ {
7176
+ "op": "move",
7177
+ "from": "members[].meta.days",
7178
+ "to": "instances[].meta.days"
7179
+ },
7180
+ {
7181
+ "op": "move",
7182
+ "from": "members[].meta.truckCapacity",
7183
+ "to": "instances[].meta.truckCapacity"
7184
+ },
7185
+ {
7186
+ "op": "move",
7187
+ "from": "members[].meta.truckMaxDistance",
7188
+ "to": "instances[].meta.truckMaxDistance"
7189
+ },
7190
+ {
7191
+ "op": "move",
7192
+ "from": "members[].meta.truckDistanceCost",
7193
+ "to": "instances[].meta.truckDistanceCost"
7194
+ },
7195
+ {
7196
+ "op": "move",
7197
+ "from": "members[].meta.truckDayCost",
7198
+ "to": "instances[].meta.truckDayCost"
7199
+ },
7200
+ {
7201
+ "op": "move",
7202
+ "from": "members[].meta.truckCost",
7203
+ "to": "instances[].meta.truckCost"
7204
+ },
7205
+ {
7206
+ "op": "move",
7207
+ "from": "members[].meta.technicianDistanceCost",
7208
+ "to": "instances[].meta.technicianDistanceCost"
7209
+ },
7210
+ {
7211
+ "op": "move",
7212
+ "from": "members[].meta.technicianDayCost",
7213
+ "to": "instances[].meta.technicianDayCost"
7214
+ },
7215
+ {
7216
+ "op": "move",
7217
+ "from": "members[].meta.technicianCost",
7218
+ "to": "instances[].meta.technicianCost"
7219
+ },
7220
+ {
7221
+ "op": "move",
7222
+ "from": "members[].meta.technicians",
7223
+ "to": "instances[].meta.technicians"
7224
+ },
7225
+ {
7226
+ "op": "move",
7227
+ "from": "members[].nodes[].id",
7228
+ "to": "instances[].nodes[].id"
7229
+ },
7230
+ {
7231
+ "op": "move",
7232
+ "from": "members[].nodes[].machine",
7233
+ "to": "instances[].nodes[].skill"
7234
+ },
7235
+ {
7236
+ "op": "move",
7237
+ "from": "members[].nodes[].x",
7238
+ "to": "instances[].nodes[].x"
7239
+ },
7240
+ {
7241
+ "op": "move",
7242
+ "from": "members[].nodes[].y",
7243
+ "to": "instances[].nodes[].y"
7244
+ },
7245
+ {
7246
+ "op": "move",
7247
+ "from": "members[].nodes[].kind",
7248
+ "to": "instances[].nodes[].kind"
7249
+ },
7250
+ {
7251
+ "op": "move",
7252
+ "from": "members[].nodes[].location",
7253
+ "to": "instances[].nodes[].location"
7254
+ },
7255
+ {
7256
+ "op": "move",
7257
+ "from": "members[].nodes[].fromDay",
7258
+ "to": "instances[].nodes[].fromDay"
7259
+ },
7260
+ {
7261
+ "op": "move",
7262
+ "from": "members[].nodes[].toDay",
7263
+ "to": "instances[].nodes[].toDay"
7264
+ },
7265
+ {
7266
+ "op": "move",
7267
+ "from": "members[].nodes[].amount",
7268
+ "to": "instances[].nodes[].amount"
7269
+ }
7270
+ ],
7271
+ "oneWay": []
7272
+ },
7273
+ "expectedCounts": { "instances": 27 },
7112
7274
  "properties": { "surveyId": "or-24" }
7113
7275
  },
7114
7276
  {
@@ -17174,7 +17336,7 @@ var catalogue_default = {
17174
17336
  "citations": [],
17175
17337
  "recipe": {
17176
17338
  "status": "not-fetchable",
17177
- "reason": "The instances are keyword format text files on a Wayback Machine snapshot, a collection of separate files, and a collection is more than one or/v1 document, so no recipe reads it."
17339
+ "reason": "The instances are keyword format text files that the Wayback Machine serves one at a time, as the archive zips of each set were not captured, and a recipe reads one download, so no recipe reaches the collection."
17178
17340
  },
17179
17341
  "crosswalk": { "file": "crosswalks/or-v1/nodes.json" },
17180
17342
  "expectedCounts": {},
@@ -56309,20 +56471,119 @@ var catalogue_default = {
56309
56471
  "territory",
56310
56472
  "travelTime"
56311
56473
  ],
56312
- "category": "or/v1",
56474
+ "category": "or-set/v1",
56313
56475
  "sources": [{
56314
56476
  "url": "http://www.vrp-rep.org/datasets/download/angelelli-et-al-2014.zip",
56315
56477
  "retrieved": "2026-10-19",
56316
56478
  "status": "live"
56479
+ }, {
56480
+ "url": "https://www.vrp-rep.org/datasets/download/angelelli-et-al-2014.zip",
56481
+ "retrieved": "2026-10-19",
56482
+ "status": "live"
56317
56483
  }],
56318
56484
  "licence": { "kind": "unrecorded" },
56319
56485
  "citations": [],
56320
56486
  "recipe": {
56321
- "status": "not-fetchable",
56322
- "reason": "The download is a collection of TSPLIB style instance files whose prizes belong to overlapping clusters of nodes and not to nodes, and a collection is more than one or/v1 document, so no recipe reads it."
56487
+ "status": "fetchable",
56488
+ "source": 1,
56489
+ "archive": {
56490
+ "kind": "zip",
56491
+ "members": { "extensions": [".cop"] }
56492
+ },
56493
+ "parser": {
56494
+ "format": "tsplib",
56495
+ "encoding": "utf-8"
56496
+ }
56323
56497
  },
56324
- "crosswalk": { "file": "crosswalks/or-v1/nodes.json" },
56325
- "expectedCounts": {},
56498
+ "crosswalk": {
56499
+ "source": "tsplib",
56500
+ "target": "or-set/v1",
56501
+ "rules": [
56502
+ {
56503
+ "op": "move",
56504
+ "from": "meta",
56505
+ "to": "meta"
56506
+ },
56507
+ {
56508
+ "op": "move",
56509
+ "from": "members[].id",
56510
+ "to": "instances[].id"
56511
+ },
56512
+ {
56513
+ "op": "move",
56514
+ "from": "members[].meta.name",
56515
+ "to": "instances[].meta.name"
56516
+ },
56517
+ {
56518
+ "op": "move",
56519
+ "from": "members[].meta.type",
56520
+ "to": "instances[].meta.type"
56521
+ },
56522
+ {
56523
+ "op": "move",
56524
+ "from": "members[].meta.budget",
56525
+ "to": "instances[].meta.budget"
56526
+ },
56527
+ {
56528
+ "op": "move",
56529
+ "from": "members[].meta.edgeWeightType",
56530
+ "to": "instances[].meta.edgeWeightType"
56531
+ },
56532
+ {
56533
+ "op": "move",
56534
+ "from": "members[].meta.setPrizes",
56535
+ "to": "instances[].meta.setPrizes"
56536
+ },
56537
+ {
56538
+ "op": "move",
56539
+ "from": "members[].nodes[].id",
56540
+ "to": "instances[].nodes[].id"
56541
+ },
56542
+ {
56543
+ "op": "move",
56544
+ "from": "members[].nodes[].lat",
56545
+ "to": "instances[].nodes[].lat"
56546
+ },
56547
+ {
56548
+ "op": "move",
56549
+ "from": "members[].nodes[].lon",
56550
+ "to": "instances[].nodes[].lon"
56551
+ },
56552
+ {
56553
+ "op": "move",
56554
+ "from": "members[].nodes[].x",
56555
+ "to": "instances[].nodes[].x"
56556
+ },
56557
+ {
56558
+ "op": "move",
56559
+ "from": "members[].nodes[].y",
56560
+ "to": "instances[].nodes[].y"
56561
+ },
56562
+ {
56563
+ "op": "move",
56564
+ "from": "members[].nodes[].clusters",
56565
+ "to": "instances[].nodes[].clusters"
56566
+ }
56567
+ ],
56568
+ "oneWay": [
56569
+ {
56570
+ "op": "drop",
56571
+ "from": "members[].meta.totalPrize",
56572
+ "direction": "encode"
56573
+ },
56574
+ {
56575
+ "op": "drop",
56576
+ "from": "members[].nodes[].prize",
56577
+ "direction": "encode"
56578
+ },
56579
+ {
56580
+ "op": "drop",
56581
+ "from": "members[].nodes[].probability",
56582
+ "direction": "encode"
56583
+ }
56584
+ ]
56585
+ },
56586
+ "expectedCounts": { "instances": 924 },
56326
56587
  "properties": { "surveyId": "or-4" }
56327
56588
  },
56328
56589
  {
@@ -56333,7 +56594,7 @@ var catalogue_default = {
56333
56594
  "description": "Park-and-loop routing instances built from real client locations in France, with coordinates and service times in minutes.",
56334
56595
  "domain": "Vehicle routing with time windows",
56335
56596
  "tags": ["location", "duration"],
56336
- "category": "or/v1",
56597
+ "category": "or-set/v1",
56337
56598
  "sources": [{
56338
56599
  "url": "http://www.vrp-rep.org/datasets/download/cabrera-et-al-2021.zip",
56339
56600
  "retrieved": "2026-10-19",
@@ -56346,12 +56607,86 @@ var catalogue_default = {
56346
56607
  "licence": { "kind": "unrecorded" },
56347
56608
  "citations": [],
56348
56609
  "recipe": {
56349
- "status": "not-fetchable",
56350
- "reason": "The download is a collection of separate coordinate files plus a readme, and a collection is more than one or/v1 document, so no recipe reads it."
56610
+ "status": "fetchable",
56611
+ "source": 1,
56612
+ "archive": {
56613
+ "kind": "zip",
56614
+ "members": { "pattern": "Coordinates_\\d+\\.txt" }
56615
+ },
56616
+ "parser": {
56617
+ "format": "csv-table",
56618
+ "encoding": "utf-8",
56619
+ "delimiter": "comma",
56620
+ "skipLines": 0,
56621
+ "idColumn": "ID",
56622
+ "numericColumns": [
56623
+ {
56624
+ "column": "Longitude",
56625
+ "factor": 1
56626
+ },
56627
+ {
56628
+ "column": "Latitude",
56629
+ "factor": 1
56630
+ },
56631
+ {
56632
+ "column": "ServiceTime_min",
56633
+ "factor": 60
56634
+ }
56635
+ ],
56636
+ "columns": [
56637
+ "ServiceTime_min",
56638
+ "Latitude",
56639
+ "Longitude"
56640
+ ]
56641
+ }
56351
56642
  },
56352
- "crosswalk": { "file": "crosswalks/or-v1/nodes.json" },
56353
- "expectedCounts": {},
56354
- "properties": { "surveyId": "or-10" }
56643
+ "crosswalk": {
56644
+ "source": "csv-table",
56645
+ "target": "or-set/v1",
56646
+ "rules": [
56647
+ {
56648
+ "op": "move",
56649
+ "from": "meta",
56650
+ "to": "meta"
56651
+ },
56652
+ {
56653
+ "op": "move",
56654
+ "from": "members[].id",
56655
+ "to": "instances[].id"
56656
+ },
56657
+ {
56658
+ "op": "move",
56659
+ "from": "members[].meta",
56660
+ "to": "instances[].meta"
56661
+ },
56662
+ {
56663
+ "op": "move",
56664
+ "from": "members[].nodes[].id",
56665
+ "to": "instances[].nodes[].id"
56666
+ },
56667
+ {
56668
+ "op": "move",
56669
+ "from": "members[].nodes[].ServiceTime_min",
56670
+ "to": "instances[].nodes[].duration"
56671
+ },
56672
+ {
56673
+ "op": "move",
56674
+ "from": "members[].nodes[].Latitude",
56675
+ "to": "instances[].nodes[].lat"
56676
+ },
56677
+ {
56678
+ "op": "move",
56679
+ "from": "members[].nodes[].Longitude",
56680
+ "to": "instances[].nodes[].lon"
56681
+ }
56682
+ ],
56683
+ "oneWay": []
56684
+ },
56685
+ "expectedCounts": { "instances": 60 },
56686
+ "properties": {
56687
+ "surveyId": "or-10",
56688
+ "timeUnit": "seconds"
56689
+ }
56355
56690
  },
56356
56691
  {
56357
56692
  "id": "vrp-rep-probabilistic-orienteering",
@@ -56365,20 +56700,116 @@ var catalogue_default = {
56365
56700
  "location",
56366
56701
  "travelTime"
56367
56702
  ],
56368
- "category": "or/v1",
56703
+ "category": "or-set/v1",
56369
56704
  "sources": [{
56370
56705
  "url": "http://www.vrp-rep.org/datasets/download/angelelli-et-al-2017.zip",
56371
56706
  "retrieved": "2026-10-19",
56372
56707
  "status": "live"
56708
+ }, {
56709
+ "url": "https://www.vrp-rep.org/datasets/download/angelelli-et-al-2017.zip",
56710
+ "retrieved": "2026-10-19",
56711
+ "status": "live"
56373
56712
  }],
56374
56713
  "licence": { "kind": "unrecorded" },
56375
56714
  "citations": [],
56376
56715
  "recipe": {
56377
- "status": "not-fetchable",
56378
- "reason": "The download is a collection of TSPLIB style instance files with a prize and probability section, half of which carry no coordinates and some of which use the degrees and minutes form, and a collection is more than one or/v1 document, so no recipe reads it."
56716
+ "status": "fetchable",
56717
+ "source": 1,
56718
+ "archive": {
56719
+ "kind": "zip",
56720
+ "members": { "extensions": [".pop"] }
56721
+ },
56722
+ "parser": {
56723
+ "format": "tsplib",
56724
+ "encoding": "utf-8"
56725
+ }
56379
56726
  },
56380
- "crosswalk": { "file": "crosswalks/or-v1/nodes.json" },
56381
- "expectedCounts": {},
56727
+ "crosswalk": {
56728
+ "source": "tsplib",
56729
+ "target": "or-set/v1",
56730
+ "rules": [
56731
+ {
56732
+ "op": "move",
56733
+ "from": "meta",
56734
+ "to": "meta"
56735
+ },
56736
+ {
56737
+ "op": "move",
56738
+ "from": "members[].id",
56739
+ "to": "instances[].id"
56740
+ },
56741
+ {
56742
+ "op": "move",
56743
+ "from": "members[].meta.name",
56744
+ "to": "instances[].meta.name"
56745
+ },
56746
+ {
56747
+ "op": "move",
56748
+ "from": "members[].meta.type",
56749
+ "to": "instances[].meta.type"
56750
+ },
56751
+ {
56752
+ "op": "move",
56753
+ "from": "members[].meta.budget",
56754
+ "to": "instances[].meta.budget"
56755
+ },
56756
+ {
56757
+ "op": "move",
56758
+ "from": "members[].meta.edgeWeightType",
56759
+ "to": "instances[].meta.edgeWeightType"
56760
+ },
56761
+ {
56762
+ "op": "move",
56763
+ "from": "members[].meta.totalPrize",
56764
+ "to": "instances[].meta.totalPrize"
56765
+ },
56766
+ {
56767
+ "op": "move",
56768
+ "from": "members[].nodes[].id",
56769
+ "to": "instances[].nodes[].id"
56770
+ },
56771
+ {
56772
+ "op": "move",
56773
+ "from": "members[].nodes[].lat",
56774
+ "to": "instances[].nodes[].lat"
56775
+ },
56776
+ {
56777
+ "op": "move",
56778
+ "from": "members[].nodes[].lon",
56779
+ "to": "instances[].nodes[].lon"
56780
+ },
56781
+ {
56782
+ "op": "move",
56783
+ "from": "members[].nodes[].prize",
56784
+ "to": "instances[].nodes[].prize"
56785
+ },
56786
+ {
56787
+ "op": "move",
56788
+ "from": "members[].nodes[].probability",
56789
+ "to": "instances[].nodes[].prizeProbability"
56790
+ },
56791
+ {
56792
+ "op": "move",
56793
+ "from": "members[].nodes[].x",
56794
+ "to": "instances[].nodes[].x"
56795
+ },
56796
+ {
56797
+ "op": "move",
56798
+ "from": "members[].nodes[].y",
56799
+ "to": "instances[].nodes[].y"
56800
+ }
56801
+ ],
56802
+ "oneWay": [{
56803
+ "op": "drop",
56804
+ "from": "members[].meta.setPrizes",
56805
+ "direction": "encode"
56806
+ }, {
56807
+ "op": "drop",
56808
+ "from": "members[].nodes[].clusters",
56809
+ "direction": "encode"
56810
+ }]
56811
+ },
56812
+ "expectedCounts": { "instances": 264 },
56382
56813
  "properties": { "surveyId": "or-3" }
56383
56814
  },
56384
56815
  {
@@ -56394,20 +56825,93 @@ var catalogue_default = {
56394
56825
  "duration",
56395
56826
  "travelTime"
56396
56827
  ],
56397
- "category": "or/v1",
56828
+ "category": "or-set/v1",
56398
56829
  "sources": [{
56399
56830
  "url": "http://www.vrp-rep.org/datasets/download/pillac-et-al-2013.zip",
56400
56831
  "retrieved": "2026-10-19",
56401
56832
  "status": "live"
56833
+ }, {
56834
+ "url": "https://www.vrp-rep.org/datasets/download/pillac-et-al-2013.zip",
56835
+ "retrieved": "2026-10-19",
56836
+ "status": "live"
56402
56837
  }],
56403
56838
  "licence": { "kind": "unrecorded" },
56404
56839
  "citations": [],
56405
56840
  "recipe": {
56406
- "status": "not-fetchable",
56407
- "reason": "The download is a collection of VRP-REP XML instance files holding coordinates and skills but no times, and a collection is more than one or/v1 document, so no recipe reads it."
56841
+ "status": "fetchable",
56842
+ "source": 1,
56843
+ "archive": {
56844
+ "kind": "zip",
56845
+ "members": { "extensions": [".xml"] }
56846
+ },
56847
+ "parser": {
56848
+ "format": "vrp-rep",
56849
+ "encoding": "utf-8"
56850
+ }
56408
56851
  },
56409
- "crosswalk": { "file": "crosswalks/or-v1/nodes.json" },
56410
- "expectedCounts": {},
56852
+ "crosswalk": {
56853
+ "source": "vrp-rep",
56854
+ "target": "or-set/v1",
56855
+ "rules": [
56856
+ {
56857
+ "op": "move",
56858
+ "from": "meta",
56859
+ "to": "meta"
56860
+ },
56861
+ {
56862
+ "op": "move",
56863
+ "from": "members[].id",
56864
+ "to": "instances[].id"
56865
+ },
56866
+ {
56867
+ "op": "move",
56868
+ "from": "members[].meta.dataset",
56869
+ "to": "instances[].meta.dataset"
56870
+ },
56871
+ {
56872
+ "op": "move",
56873
+ "from": "members[].meta.name",
56874
+ "to": "instances[].meta.name"
56875
+ },
56876
+ {
56877
+ "op": "move",
56878
+ "from": "members[].nodes[].id",
56879
+ "to": "instances[].nodes[].id"
56880
+ },
56881
+ {
56882
+ "op": "move",
56883
+ "from": "members[].nodes[].skill",
56884
+ "to": "instances[].nodes[].skill"
56885
+ },
56886
+ {
56887
+ "op": "move",
56888
+ "from": "members[].nodes[].x",
56889
+ "to": "instances[].nodes[].x"
56890
+ },
56891
+ {
56892
+ "op": "move",
56893
+ "from": "members[].nodes[].y",
56894
+ "to": "instances[].nodes[].y"
56895
+ },
56896
+ {
56897
+ "op": "move",
56898
+ "from": "members[].nodes[].type",
56899
+ "to": "instances[].nodes[].type"
56900
+ },
56901
+ {
56902
+ "op": "move",
56903
+ "from": "members[].nodes[].skills",
56904
+ "to": "instances[].nodes[].skills"
56905
+ },
56906
+ {
56907
+ "op": "move",
56908
+ "from": "members[].nodes[].resources",
56909
+ "to": "instances[].nodes[].resources"
56910
+ }
56911
+ ],
56912
+ "oneWay": []
56913
+ },
56914
+ "expectedCounts": { "instances": 57 },
56411
56915
  "properties": { "surveyId": "or-21" }
56412
56916
  },
56413
56917
  {
@@ -57456,6 +57960,10 @@ var catalogue_default = {
57456
57960
  "url": "https://zenodo.org/records/5823834",
57457
57961
  "retrieved": "2026-10-19",
57458
57962
  "status": "live"
57963
+ }, {
57964
+ "url": "https://zenodo.org/records/5823834/files/MeterReading_Instance.zip?download=1",
57965
+ "retrieved": "2026-10-19",
57966
+ "status": "live"
57459
57967
  }],
57460
57968
  "licence": {
57461
57969
  "kind": "spdx",
@@ -57463,11 +57971,45 @@ var catalogue_default = {
57463
57971
  },
57464
57972
  "citations": [],
57465
57973
  "recipe": {
57466
- "status": "not-fetchable",
57467
- "reason": "The download is one arc routing instance in two tab separated text files with no column names, holding only planar coordinates of customers and a road network, so there is no field of the or/v1 node beyond a position and no table the parser reads."
57974
+ "status": "fetchable",
57975
+ "source": 1,
57976
+ "archive": {
57977
+ "kind": "zip",
57978
+ "member": { "path": "customers.txt" }
57979
+ },
57980
+ "parser": {
57981
+ "format": "customer-points",
57982
+ "encoding": "utf-8"
57983
+ }
57468
57984
  },
57469
- "crosswalk": { "file": "crosswalks/or-v1/nodes.json" },
57470
- "expectedCounts": {},
57985
+ "crosswalk": {
57986
+ "source": "customer-points",
57987
+ "target": "or/v1",
57988
+ "rules": [
57989
+ {
57990
+ "op": "move",
57991
+ "from": "meta",
57992
+ "to": "meta"
57993
+ },
57994
+ {
57995
+ "op": "move",
57996
+ "from": "nodes[].id",
57997
+ "to": "nodes[].id"
57998
+ },
57999
+ {
58000
+ "op": "move",
58001
+ "from": "nodes[].x",
58002
+ "to": "nodes[].x"
58003
+ },
58004
+ {
58005
+ "op": "move",
58006
+ "from": "nodes[].y",
58007
+ "to": "nodes[].y"
58008
+ }
58009
+ ],
58010
+ "oneWay": []
58011
+ },
58012
+ "expectedCounts": { "nodes": 6067 },
57471
58013
  "properties": { "surveyId": "or-6" }
57472
58014
  },
57473
58015
  {
@@ -57535,7 +58077,7 @@ var catalogue_default = {
57535
58077
  "citations": [],
57536
58078
  "recipe": {
57537
58079
  "status": "not-fetchable",
57538
- "reason": "The Zenodo files are a custom sectioned text format (technicians, tasks and a travel time matrix of millions of lines) and not a table, and two of them are collections of instance files."
58080
+ "reason": "The instances are a custom sectioned text format whose tasks have no positions, and the collection is hundreds of megabytes compressed, almost all of it a pairwise travel time matrix that or/v1 has no arcs to hold, so reading it would hold gigabytes in memory to keep a few fields per task."
57539
58081
  },
57540
58082
  "crosswalk": { "file": "crosswalks/or-v1/nodes.json" },
57541
58083
  "expectedCounts": {},