Task.read interprets data incorrectly for short reads
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 3/5
- Tempo stimato
- 1-2 giorni
- Idoneità per principianti
- 45/100
- Tipo di issue
- Bug
- Chiarezza
- Abbastanza chiara
- Stato di attività
- Ferma
- Stack tecnologico
- python
- Ambito
- api, testing-qa
Direzione di ricerca
Inizia da nidaqmx.Task.read e dal test descritto in tests/component/test_task_read_ai.py, in particolare dal caso di acquisizione finita multicanale con una lettura parziale. Riproduci il problema impostando samples_to_acquire su 5 e samples_to_read su 10, quindi verifica che i dati 2D restituiti contengano i campioni validi per ogni canale senza valori sovrascritti.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
When DAQmxReadAnalogF64 with DAQmx_Val_GroupByChannel returns fewer samples than requested, it squashes the valid samples together at the beginning of the buffer. The way that nidaqmx.Task.read handles short reads doesn't take this into account, so it may return samples that have been overwritten.
Test case (from tests/component/test_task_read_ai.py, under development):
def test___analog_multi_channel_finite___read_too_many_sample___returns_valid_2d_channels_samples_truncated(
ai_multi_channel_task: nidaqmx.Task,
) -> None:
samples_to_acquire = 5
ai_multi_channel_task.timing.cfg_samp_clk_timing(rate=1000.0, sample_mode=AcquisitionType.FINITE, samps_per_chan=samples_to_acquire)
num_channels = ai_multi_channel_task.number_of_channels
samples_to_read = 10
data = ai_multi_channel_task.read(samples_to_read)
expected = [
[_get_voltage_offset_for_chan(chan_index) for _ in range(samples_to_acquire)]
for chan_index in range(num_channels)
]
_assert_equal_2d(data, expected, abs=VOLTAGE_EPSILON)
Result (lib and grpc fail the same way, because the underlying interpreters have consistent behavior here):
_ test___analog_multi_channel_finite___read_too_many_sample___returns_valid_2d_channels_samples_truncated[library_init_kwargs] _
ai_multi_channel_task = Task(name=_unnamedTask<0>)
def test___analog_multi_channel_finite___read_too_many_sample___returns_valid_2d_channels_samples_truncated(
ai_multi_channel_task: nidaqmx.Task,
) -> None:
samples_to_acquire = 5
ai_multi_channel_task.timing.cfg_samp_clk_timing(rate=1000.0, sample_mode=AcquisitionType.FINITE, samps_per_chan=samples_to_acquire)
num_channels = ai_multi_channel_task.number_of_channels
samples_to_read = 10
data = ai_multi_channel_task.read(samples_to_read)
expected = [
[_get_voltage_offset_for_chan(chan_index) for _ in range(samples_to_acquire)]
for chan_index in range(num_channels)
]
> _assert_equal_2d(data, expected, abs=VOLTAGE_EPSILON)
tests\component\test_task_read_ai.py:144:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
data = [[1.000091555528428, 1.000396740623188, 1.000396740623188, 0.999786370433668, 0.999786370433668], [3.000274666585284, ...4, 2.999969481490524], [3.000274666585284, 3.000579851680044, 3.000579851680044, 2.999969481490524, 2.999969481490524]]
expected = [[1.0, 1.0, 1.0, 1.0, 1.0], [2.0, 2.0, 2.0, 2.0, 2.0], [3.0, 3.0, 3.0, 3.0, 3.0]], abs = 0.001
def _assert_equal_2d(data: List[List[float]], expected: List[List[float]], abs: float) -> None:
# pytest.approx() does not support nested data structures.
assert len(data) == len(expected)
for i in range(len(data)):
> assert data[i] == pytest.approx(expected[i], abs=abs)
E assert [3.000274666585284, 3.000579851680044, 3.000579851680044, 2.999969481490524, 2.999969481490524] == approx([2.0 ± 1.0e-03, 2.0 ± 1.0e-03, 2.0 ± 1.0e-03, 2.0 ± 1.0e-03, 2.0 ± 1.0e-03])
E
E comparison failed. Mismatched elements: 5 / 5:
E Max absolute difference: 1.000579851680044
E Max relative difference: 0.3334621643612693
E Index | Obtained | Expected
E 0 | 3.000274666585284 | 2.0 ± 1.0e-03
E 1 | 3.000579851680044 | 2.0 ± 1.0e-03
E 2 | 3.000579851680044 | 2.0 ± 1.0e-03
E 3 | 2.999969481490524 | 2.0 ± 1.0e-03
E 4 | 2.999969481490524 | 2.0 ± 1.0e-03
tests\component\test_task_read_ai.py:151: AssertionError
NI IO Trace shows:
The original array was
[1,1,1,1,1,0,0,0,0,0,2,2,2,2,2,0,0,0,0,0,3,3,3,3,3,0,0,0,0,0]
then it was squashed to
[1,1,1,1,1,2,2,2,2,2,3,3,3,3,3,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x]
When this happened, the old 2s were overwritten with 3s.
This test case passes if you increase the number of samples to acquire because a larger read buffer prevents the old/new sample positions from overlapping.
- Lingua principale
- Python
- Stelle
- 592
- Fork
- 199
- Merge medio
- 1g 16h
- PR unite (30g)
- 10
Guida per i contributori
Apri la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di ni/nidaqmx-python
-
tech debt
Difficoltà 4/5 3-5 giorni Idoneità per principianti 38/100
ni/nidaqmx-python#945 ·
-
bug
Difficoltà 4/5 3-5 giorni Idoneità per principianti 35/100
ni/nidaqmx-python#941 ·
-
Potential typos in the API Apertabug
Difficoltà 3/5 1-2 giorni Idoneità per principianti 42/100
ni/nidaqmx-python#939 ·
-
Add gRPC examples Apertaenhancement
Difficoltà 3/5 1-2 giorni Idoneità per principianti 45/100
ni/nidaqmx-python#917 · 1 commento · 1 reazione ·
-
enhancement
Difficoltà 4/5 3-5 giorni Idoneità per principianti 38/100
ni/nidaqmx-python#914 · 1 commento ·
Tutte le issue di ni/nidaqmx-python
Issue simili
-
area: harness bug status: needs-triage
Difficoltà 2/5 1-3 ore Idoneità per principianti 75/100
Human-Agent-Society/reef#625 ·
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 70/100
-
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 80/100
learningequality/kolibri#15351 · 2 commenti ·
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 75/100
-
Name consistency Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 75/100
eellak/triplestore#65 · 1 commento ·