Skip to content

Commit a570b21

Browse files
authored
JavaScript: return Float64Arrays rather than Arrays.
2 parents d4b669b + 64dd948 commit a570b21

File tree

4 files changed

+39
-27
lines changed

4 files changed

+39
-27
lines changed

VERSION.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
0.20260211.0
1+
0.20260226.0

src/sed/sedinstancetask.cpp

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,18 @@ limitations under the License.
2525

2626
namespace libOpenCOR {
2727

28+
#ifdef __EMSCRIPTEN__
29+
static emscripten::val toFloat64Array(const Doubles &data)
30+
{
31+
auto view {emscripten::typed_memory_view(data.size(), data.data())};
32+
auto res {emscripten::val::global("Float64Array").new_(data.size())};
33+
34+
res.call<void>("set", view);
35+
36+
return res;
37+
}
38+
#endif
39+
2840
SedInstanceTaskPtr SedInstanceTask::Impl::create(const SedAbstractTaskPtr &pTask)
2941
{
3042
auto res {SedInstanceTaskPtr {new SedInstanceTask {pTask}}};
@@ -527,7 +539,7 @@ Doubles SedInstanceTask::voi() const
527539
#ifdef __EMSCRIPTEN__
528540
emscripten::val SedInstanceTask::voiAsArray() const
529541
{
530-
return emscripten::val::array(voi());
542+
return toFloat64Array(voi());
531543
}
532544
#endif
533545

@@ -554,7 +566,7 @@ Doubles SedInstanceTask::state(size_t pIndex) const
554566
#ifdef __EMSCRIPTEN__
555567
emscripten::val SedInstanceTask::stateAsArray(size_t pIndex) const
556568
{
557-
return emscripten::val::array(state(pIndex));
569+
return toFloat64Array(state(pIndex));
558570
}
559571
#endif
560572

@@ -581,7 +593,7 @@ Doubles SedInstanceTask::rate(size_t pIndex) const
581593
#ifdef __EMSCRIPTEN__
582594
emscripten::val SedInstanceTask::rateAsArray(size_t pIndex) const
583595
{
584-
return emscripten::val::array(rate(pIndex));
596+
return toFloat64Array(rate(pIndex));
585597
}
586598
#endif
587599

@@ -608,7 +620,7 @@ Doubles SedInstanceTask::constant(size_t pIndex) const
608620
#ifdef __EMSCRIPTEN__
609621
emscripten::val SedInstanceTask::constantAsArray(size_t pIndex) const
610622
{
611-
return emscripten::val::array(constant(pIndex));
623+
return toFloat64Array(constant(pIndex));
612624
}
613625
#endif
614626

@@ -635,7 +647,7 @@ Doubles SedInstanceTask::computedConstant(size_t pIndex) const
635647
#ifdef __EMSCRIPTEN__
636648
emscripten::val SedInstanceTask::computedConstantAsArray(size_t pIndex) const
637649
{
638-
return emscripten::val::array(computedConstant(pIndex));
650+
return toFloat64Array(computedConstant(pIndex));
639651
}
640652
#endif
641653

@@ -662,7 +674,7 @@ Doubles SedInstanceTask::algebraicVariable(size_t pIndex) const
662674
#ifdef __EMSCRIPTEN__
663675
emscripten::val SedInstanceTask::algebraicVariableAsArray(size_t pIndex) const
664676
{
665-
return emscripten::val::array(algebraicVariable(pIndex));
677+
return toFloat64Array(algebraicVariable(pIndex));
666678
}
667679
#endif
668680

tests/bindings/javascript/res/index.html

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -47,13 +47,14 @@
4747
<div class="drop-area-div">
4848
<i class="far fa-images"></i>
4949

50-
<span>Choose a CellML / SED-ML file or a COMBINE archive, </span>
50+
<span>Choose a CellML / SED-ML file or a COMBINE archive,</span>
5151

52-
<span>or drag and drop such a file here. </span>
52+
<span>or drag and drop such a file here.</span>
5353

5454
<p class="note">
5555
<small>
56-
<span class="bold">Note:</span>only CellML files with no imports can (currently) be processed.
56+
<span class="bold">Note:</span>
57+
only CellML files with no imports can (currently) be processed.
5758
</small>
5859
</p>
5960
</div>
@@ -95,9 +96,7 @@
9596
<span class="input-group-text" id="yAxisUnit"></span>
9697
</div>
9798
</div>
98-
<div>
99-
<button type="button" class="btn btn-secondary mb-3 run-button w-100" id="run">Run</button>
100-
</div>
99+
<div><button type="button" class="btn btn-secondary mb-3 run-button w-100" id="run">Run</button></div>
101100
</div>
102101
</div>
103102

tests/bindings/javascript/sed.coverage.test.js

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import * as utils from './utils.js';
2222
import { assertIssues, assertValues } from './utils.js';
2323

2424
const loc = await libOpenCOR();
25+
const emptyFloat64Array = new Float64Array();
2526

2627
test.describe('Sed coverage tests', () => {
2728
test.beforeEach(() => {
@@ -377,55 +378,55 @@ test.describe('Sed coverage tests', () => {
377378
assert.strictEqual(instance.task(1), null);
378379

379380
assert.strictEqual(instanceTask.voi.size(), 0);
380-
assert.deepStrictEqual(instanceTask.voiAsArray, []);
381+
assert.deepStrictEqual(instanceTask.voiAsArray, emptyFloat64Array);
381382
assert.strictEqual(instanceTask.voiName, 'environment/time');
382383
assert.strictEqual(instanceTask.voiUnit, 'millisecond');
383384

384385
assert.strictEqual(instanceTask.stateCount, 4);
385386
assert.strictEqual(instanceTask.state(0).size(), 0);
386-
assert.deepStrictEqual(instanceTask.stateAsArray(0), []);
387+
assert.deepStrictEqual(instanceTask.stateAsArray(0), emptyFloat64Array);
387388
assert.strictEqual(instanceTask.state(4).size(), 0);
388-
assert.deepStrictEqual(instanceTask.stateAsArray(4), []);
389+
assert.deepStrictEqual(instanceTask.stateAsArray(4), emptyFloat64Array);
389390
assert.strictEqual(instanceTask.stateName(0), 'membrane/V');
390391
assert.strictEqual(instanceTask.stateName(4), '');
391392
assert.strictEqual(instanceTask.stateUnit(0), 'millivolt');
392393
assert.strictEqual(instanceTask.stateUnit(4), '');
393394

394395
assert.strictEqual(instanceTask.rateCount, 4);
395396
assert.strictEqual(instanceTask.rate(0).size(), 0);
396-
assert.deepStrictEqual(instanceTask.rateAsArray(0), []);
397+
assert.deepStrictEqual(instanceTask.rateAsArray(0), emptyFloat64Array);
397398
assert.strictEqual(instanceTask.rate(4).size(), 0);
398-
assert.deepStrictEqual(instanceTask.rateAsArray(4), []);
399+
assert.deepStrictEqual(instanceTask.rateAsArray(4), emptyFloat64Array);
399400
assert.strictEqual(instanceTask.rateName(0), "membrane/V'");
400401
assert.strictEqual(instanceTask.rateName(4), '');
401402
assert.strictEqual(instanceTask.rateUnit(0), 'millivolt/millisecond');
402403
assert.strictEqual(instanceTask.rateUnit(4), '');
403404

404405
assert.strictEqual(instanceTask.constantCount, 5);
405406
assert.strictEqual(instanceTask.constant(0).size(), 0);
406-
assert.deepStrictEqual(instanceTask.constantAsArray(0), []);
407+
assert.deepStrictEqual(instanceTask.constantAsArray(0), emptyFloat64Array);
407408
assert.strictEqual(instanceTask.constant(5).size(), 0);
408-
assert.deepStrictEqual(instanceTask.constantAsArray(5), []);
409+
assert.deepStrictEqual(instanceTask.constantAsArray(5), emptyFloat64Array);
409410
assert.strictEqual(instanceTask.constantName(0), 'membrane/Cm');
410411
assert.strictEqual(instanceTask.constantName(5), '');
411412
assert.strictEqual(instanceTask.constantUnit(0), 'microF_per_cm2');
412413
assert.strictEqual(instanceTask.constantUnit(5), '');
413414

414415
assert.strictEqual(instanceTask.computedConstantCount, 3);
415416
assert.strictEqual(instanceTask.computedConstant(0).size(), 0);
416-
assert.deepStrictEqual(instanceTask.computedConstantAsArray(0), []);
417+
assert.deepStrictEqual(instanceTask.computedConstantAsArray(0), emptyFloat64Array);
417418
assert.strictEqual(instanceTask.computedConstant(3).size(), 0);
418-
assert.deepStrictEqual(instanceTask.computedConstantAsArray(3), []);
419+
assert.deepStrictEqual(instanceTask.computedConstantAsArray(3), emptyFloat64Array);
419420
assert.strictEqual(instanceTask.computedConstantName(0), 'leakage_current/E_L');
420421
assert.strictEqual(instanceTask.computedConstantName(3), '');
421422
assert.strictEqual(instanceTask.computedConstantUnit(0), 'millivolt');
422423
assert.strictEqual(instanceTask.computedConstantUnit(3), '');
423424

424425
assert.strictEqual(instanceTask.algebraicVariableCount, 10);
425426
assert.strictEqual(instanceTask.algebraicVariable(0).size(), 0);
426-
assert.deepStrictEqual(instanceTask.algebraicVariableAsArray(0), []);
427+
assert.deepStrictEqual(instanceTask.algebraicVariableAsArray(0), emptyFloat64Array);
427428
assert.strictEqual(instanceTask.algebraicVariable(10).size(), 0);
428-
assert.deepStrictEqual(instanceTask.algebraicVariableAsArray(10), []);
429+
assert.deepStrictEqual(instanceTask.algebraicVariableAsArray(10), emptyFloat64Array);
429430
assert.strictEqual(instanceTask.algebraicVariableName(0), 'membrane/i_Stim');
430431
assert.strictEqual(instanceTask.algebraicVariableName(10), '');
431432
assert.strictEqual(instanceTask.algebraicVariableUnit(0), 'microA_per_cm2');
@@ -452,19 +453,19 @@ test.describe('Sed coverage tests', () => {
452453
const instanceTask = instance.tasks.get(0);
453454

454455
assert.strictEqual(instanceTask.voi.size(), 0);
455-
assert.deepStrictEqual(instanceTask.voiAsArray, []);
456+
assert.deepStrictEqual(instanceTask.voiAsArray, emptyFloat64Array);
456457
assert.strictEqual(instanceTask.voiName, '');
457458
assert.strictEqual(instanceTask.voiUnit, '');
458459

459460
assert.strictEqual(instanceTask.stateCount, 0);
460461
assert.strictEqual(instanceTask.state(0).size(), 0);
461-
assert.deepStrictEqual(instanceTask.stateAsArray(0), []);
462+
assert.deepStrictEqual(instanceTask.stateAsArray(0), emptyFloat64Array);
462463
assert.strictEqual(instanceTask.stateName(0), '');
463464
assert.strictEqual(instanceTask.stateUnit(0), '');
464465

465466
assert.strictEqual(instanceTask.rateCount, 0);
466467
assert.strictEqual(instanceTask.rate(0).size(), 0);
467-
assert.deepStrictEqual(instanceTask.rateAsArray(0), []);
468+
assert.deepStrictEqual(instanceTask.rateAsArray(0), emptyFloat64Array);
468469
assert.strictEqual(instanceTask.rateName(0), '');
469470
assert.strictEqual(instanceTask.rateUnit(0), '');
470471
});

0 commit comments

Comments
 (0)