def test_numpy_types(): """ Test that we can save numpy types in the data set """ p = ParamSpec(name="p", paramtype="numeric") test_set = qc.new_data_set("test-dataset") test_set.add_parameter(p) test_set.mark_started() idps = InterDependencies_(standalones=(p.base_version(), )) data_saver = DataSaver(dataset=test_set, write_period=0, interdeps=idps) dtypes = [ np.int8, np.int16, np.int32, np.int64, np.float16, np.float32, np.float64 ] for dtype in dtypes: data_saver.add_result(("p", dtype(2))) data_saver.flush_data_to_database() data = test_set.get_data("p") assert data == [[2] for _ in range(len(dtypes))]
def test_saving_numeric_values_as_text(numeric_type): """ Test the saving numeric values into 'text' parameter raises an exception """ p = ParamSpec("p", "text") test_set = qc.new_data_set("test-dataset") test_set.add_parameter(p) test_set.mark_started() idps = InterDependencies_(standalones=(p.base_version(), )) data_saver = DataSaver(dataset=test_set, write_period=0, interdeps=idps) try: value = numeric_type(2) gottype = np.array(value).dtype msg = re.escape(f'Parameter {p.name} is of type ' f'"{p.type}", but got a result of ' f'type {gottype} ({value}).') with pytest.raises(ValueError, match=msg): data_saver.add_result((p.name, value)) finally: data_saver.dataset.conn.close()
def test_base_version(paramspecs): kwargs = paramspecs[0] ps = ParamSpec(**kwargs) ps_base = ParamSpecBase(name=kwargs['name'], paramtype=kwargs['paramtype'], label=kwargs['label'], unit=kwargs['unit']) assert ps.base_version() == ps_base
def test_string_via_datasaver(experiment): """ Test that we can save text into database via DataSaver API """ p = ParamSpec(name="p", paramtype="text") test_set = qc.new_data_set("test-dataset") test_set.add_parameter(p) test_set.mark_started() idps = InterDependencies_(standalones=(p.base_version(), )) data_saver = DataSaver(dataset=test_set, write_period=0, interdeps=idps) data_saver.add_result(("p", "some text")) data_saver.flush_data_to_database() assert test_set.get_data("p") == [["some text"]]
def _extend_with_paramspec(self, ps: ParamSpec) -> 'InterDependencies_': """ Create a new InterDependencies_ object extended with the provided ParamSpec. A helper function for DataSet's add_parameter function. Note that this function will only work as expected if the ParamSpecs are extended into the InterDependencies_ in the "logical order", i.e. independent ParamSpecs before dependent ones. """ base_ps = ps.base_version() old_standalones = set(self.standalones.copy()) new_standalones: Tuple[ParamSpecBase, ...] if len(ps.depends_on_) > 0: deps_list = [self._id_to_paramspec[name] for name in ps.depends_on_] new_deps = {base_ps: tuple(deps_list)} old_standalones = old_standalones.difference(set(deps_list)) else: new_deps = {} if len(ps.inferred_from_) > 0: inffs_list = [self._id_to_paramspec[name] for name in ps.inferred_from_] new_inffs = {base_ps: tuple(inffs_list)} old_standalones = old_standalones.difference(set(inffs_list)) else: new_inffs = {} if new_deps == new_inffs == {}: new_standalones = (base_ps,) else: old_standalones = old_standalones.difference({base_ps}) new_standalones = () new_deps.update(self.dependencies.copy()) new_inffs.update(self.inferences.copy()) new_standalones = tuple(list(new_standalones) + list(old_standalones)) new_idps = InterDependencies_(dependencies=new_deps, inferences=new_inffs, standalones=new_standalones) return new_idps
def test_string_with_wrong_paramtype_via_datasaver(experiment): """ Test that it is not possible to add a string value for a non-text parameter via DataSaver object """ p = ParamSpec("p", "numeric") test_set = qc.new_data_set("test-dataset") test_set.add_parameter(p) test_set.mark_started() idps = InterDependencies_(standalones=(p.base_version(), )) data_saver = DataSaver(dataset=test_set, write_period=0, interdeps=idps) try: msg = re.escape('Parameter p is of type "numeric", but got a ' "result of type <U9 (some text).") with pytest.raises(ValueError, match=msg): data_saver.add_result(("p", "some text")) finally: data_saver.dataset.conn.close()