Skip to content

Commit

Permalink
fix double validation when setting parameters (#794)
Browse files Browse the repository at this point in the history
* fix double validation when setting parameters

* Properly fix double validation

* add example as a test
  • Loading branch information
WilliamHPNielsen authored and jenshnielsen committed Oct 19, 2017
1 parent fda5222 commit 0365f29
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 6 deletions.
14 changes: 8 additions & 6 deletions qcodes/instrument/parameter.py
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@
import os
import collections
import warnings
from typing import Optional, Sequence, TYPE_CHECKING, Union, Callable
from typing import Optional, Sequence, TYPE_CHECKING, Union, Callable, List
from functools import partial, wraps
import numpy

Expand Down Expand Up @@ -361,7 +361,7 @@ def set_wrapper(value, **kwargs):
# a list containing only `value`.
steps = self.get_ramp_values(value, step=self.step)

for val_step in steps:
for step_index, val_step in enumerate(steps):
if self.val_mapping is not None:
# Convert set values using val_mapping dictionary
mapped_value = self.val_mapping[val_step]
Expand Down Expand Up @@ -398,7 +398,9 @@ def set_wrapper(value, **kwargs):
self.raw_value = parsed_scaled_mapped_value
self._save_val(val_step,
validate=(self.val_mapping is None and
self.set_parser is None))
self.set_parser is None and
not(step_index == len(steps)-1 or
len(steps) == 1)))

# Update last set time (used for calculating delays)
self._t_last_set = time.perf_counter()
Expand All @@ -414,7 +416,9 @@ def set_wrapper(value, **kwargs):

return set_wrapper

def get_ramp_values(self, value, step=None):
def get_ramp_values(self, value: Union[float, int],
step: Union[float, int]=None) -> List[Union[float,
int]]:
"""
Return values to sweep from current value to target value.
This method can be overridden to have a custom sweep behaviour.
Expand All @@ -435,8 +439,6 @@ def get_ramp_values(self, value, step=None):
self.get()
start_value = self.raw_value

self.validate(start_value)

if not (isinstance(start_value, (int, float)) and
isinstance(value, (int, float))):
# something weird... parameter is numeric but one of the ends
Expand Down
27 changes: 27 additions & 0 deletions qcodes/tests/test_parameter.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,13 +25,27 @@ def get(self):
return 42


class BookkeepingValidator(vals.Validator):
"""
Validator that keeps track of what it validates
"""
def __init__(self, min_value=-float("inf"), max_value=float("inf")):
self.values_validated = []

def validate(self, value, context=''):
self.values_validated.append(value)

is_numeric = True


blank_instruments = (
None, # no instrument at all
namedtuple('noname', '')(), # no .name
namedtuple('blank', 'name')('') # blank .name
)
named_instrument = namedtuple('yesname', 'name')('astro')


class MemoryParameter(Parameter):
def __init__(self, get_cmd=None, **kwargs):
self.set_values = []
Expand Down Expand Up @@ -134,6 +148,19 @@ def test_explicit_attributes(self):
'setpoint_labels', 'full_names']:
self.assertFalse(hasattr(p, attr), attr)

def test_number_of_validations(self):

p = Parameter('p', set_cmd=None, initial_value=0,
vals=BookkeepingValidator())

self.assertEqual(p.vals.values_validated, [0])

p.step = 1
p.set(10)

self.assertEqual(p.vals.values_validated,
[0, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9])

def test_snapshot_value(self):
p_snapshot = Parameter('no_snapshot', set_cmd=None, get_cmd=None,
snapshot_value=True)
Expand Down

0 comments on commit 0365f29

Please sign in to comment.