edfcore 0.2.43 → 0.2.45

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.
package/CHANGELOG.md CHANGED
@@ -6,6 +6,37 @@ alone does not tell you whether you were affected.
6
6
  edfcore is pre-1.0. Patch releases have carried behaviour changes where the old behaviour was a
7
7
  defect; those are called out below.
8
8
 
9
+ ## 0.2.44
10
+
11
+ - **Added** annotation parity against pyEDFlib — the other axis, and the one edfcore has got wrong
12
+ most. The scaling harness checks arithmetic; this checks WHICH AXIS an onset is on. Six releases
13
+ were variants of "one function used the nominal grid while the rest used the record's true
14
+ onset", and every one was found by comparing edfcore against edfcore. The property test added in
15
+ 0.2.25 makes that internal agreement a hard invariant; this makes it an external one, which is a
16
+ different kind of evidence — a shared misreading of the format satisfies the first and fails
17
+ here. Onsets match to the tick, and edfcore reports no diagnostic at all on a file a reference
18
+ writer produced.
19
+ - The generator refuses to record fewer annotations than it wrote. `writeAnnotation` silently drops
20
+ an event that does not fit the region pyEDFlib sized, and the first run lost one — a golden file
21
+ recorded from that would have made the parity test compare an incomplete set and pass while doing
22
+ it.
23
+
24
+ ## 0.2.43
25
+
26
+ - **Added** parity against MNE — a second, independent reader. pyEDFlib and edfcore both descend
27
+ from EDFlib's arithmetic, so agreement between them shows edfcore copied it correctly rather than
28
+ that the answer is right; MNE is a different implementation.
29
+ - The claim is deliberately WEAKER than the pyEDFlib one and says so. MNE returns SI units, so a
30
+ microvolt channel arrives divided by 1e6 and that division is lossy — the two cannot be
31
+ bit-identical, and asserting otherwise would be asserting something false. The bound is 1e-12
32
+ relative, about a hundred times the worst observed and ten orders of magnitude below the
33
+ quantisation step of any real recording. Bit-parity remains claimed for pyEDFlib alone.
34
+ - The bound is RELATIVE rather than an ULP count, which was the first instinct and is the wrong
35
+ measure: near 1e-6 the same relative rounding spans far more representable floats than it does
36
+ near 100, so an ULP bound tight enough to be meaningful at one magnitude is meaningless at the
37
+ other. Channels MNE does not rescale — it leaves `degC` alone — are excluded rather than pushed
38
+ through a factor that would make the comparison an artefact of the test.
39
+
9
40
  ## 0.2.42
10
41
 
11
42
  - **Added** three cases to the pyEDFlib parity harness, chosen for where the two scaling
package/README.md CHANGED
@@ -299,9 +299,15 @@ back with pyEDFlib, and records every sample as its exact IEEE-754 bit pattern;
299
299
  `tests/corpus/golden/` was produced by edfcore. Substituting the numerically better textbook
300
300
  expression fails it on 140 of 256 samples — which is why the EDFlib form is pinned.
301
301
 
302
- **Still open before 1.0.** The same harness against MNE, and validation across public corpora
303
- (sleep-edfx, CHB-MIT, the BioSemi and edfplus.info test files). Those claims are not made here
304
- until a test produces them.
302
+ **MNE, as of 0.2.43.** edfcore agrees with MNE to within 1e-12 relative — a weaker claim than the
303
+ one above, and deliberately so. MNE returns SI units, so a microvolt channel arrives divided by
304
+ 1e6, and that division is lossy; the residue is MNE's unit conversion rather than a disagreement
305
+ about the sample. Bit-parity is claimed for pyEDFlib alone. Both readers also agree with the file's
306
+ own declaration about POLARITY on a negative-gain channel, which a value comparison alone could not
307
+ establish.
308
+
309
+ **Still open before 1.0.** Validation across public corpora (sleep-edfx, CHB-MIT, the BioSemi and
310
+ edfplus.info test files). That claim is not made here until a test produces it.
305
311
 
306
312
  **Shipped since 0.1.6.** Min/max envelope decimation (`readEnvelope`,
307
313
  `readEnvelopeAtResolution`). BioSemi Status-byte helpers (`readTriggers`). Streaming iteration
@@ -109,5 +109,5 @@ export declare const SIGNAL_FIELD_BLOCK_OFFSETS: {
109
109
  readonly reserved: 224;
110
110
  };
111
111
  /** Published package version. Kept in sync with package.json by a test. */
112
- export declare const VERSION = "0.2.43";
112
+ export declare const VERSION = "0.2.45";
113
113
  //# sourceMappingURL=constants.d.ts.map
package/dist/constants.js CHANGED
@@ -79,5 +79,5 @@ export const SIGNAL_FIELD_BLOCK_OFFSETS = {
79
79
  reserved: 224,
80
80
  };
81
81
  /** Published package version. Kept in sync with package.json by a test. */
82
- export const VERSION = '0.2.43';
82
+ export const VERSION = '0.2.45';
83
83
  //# sourceMappingURL=constants.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "edfcore",
3
- "version": "0.2.43",
3
+ "version": "0.2.45",
4
4
  "description": "Modern, typed, zero-dependency reader for EDF, EDF+, BDF and BDF+ biosignal files. Works in browsers and Node with true random access.",
5
5
  "keywords": [
6
6
  "edf",
package/src/constants.ts CHANGED
@@ -93,4 +93,4 @@ export const SIGNAL_FIELD_BLOCK_OFFSETS = {
93
93
  } as const;
94
94
 
95
95
  /** Published package version. Kept in sync with package.json by a test. */
96
- export const VERSION = '0.2.43';
96
+ export const VERSION = '0.2.45';