dwavesystems / dwavesystems/dimod

Constraint labels can break CQM (de-)serialization

Open
#1,358 1 comment 0 reactions 0 assignees View on GitHub
bug
Dominant language
Python
Stars
143
Forks
91
Avg merge
1h 24m
Merged PRs (30d)
3

Description

**Description**

Currently `CQM.to_file()` encodes constraint labels with [`json.dumps`](https://github.com/dwavesystems/dimod/blob/85f5bafd514f32585666e5de4c75db9b53444626/dimod/constrained/constrained.py#L1786), allowing characters that are illegal in file names, like `/`. That becomes a problem only when trying to extract the CQM zip file.

However, `CQM.from_file()` assumes forward slashes are **not allowed** in file names and that `/` is used **only** as (POSIX) path separator:

https://github.com/dwavesystems/dimod/blob/85f5bafd514f32585666e5de4c75db9b53444626/dimod/constrained/constrained.py#L1071-L1073

Consequently, decoding CQMs with slashes in constraint labels will fail.

**Steps To Reproduce**
```
>>> import dimod
>>> cqm = dimod.CQM()
>>> cqm.add_constraint(dimod.Binary() == 1, label='a/b')
'a/b'
>>> dimod.CQM.from_file(cqm.to_file())
Traceback (most recent call last):
File "", line 1, in
File "/env311/lib/python3.11/site-packages/dimod/constrained/constrained.py", line 1078, in from_file
label = deserialize_variable(json.loads(constraint))
^^^^^^^^^^^^^^^^^^^^^^
File "/lib/python3.11/json/__init__.py", line 346, in loads
return _default_decoder.decode(s)
^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/lib/python3.11/json/decoder.py", line 337, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/lib/python3.11/json/decoder.py", line 353, in raw_decode
obj, end = self.scan_once(s, idx)
^^^^^^^^^^^^^^^^^^^^^^
json.decoder.JSONDecodeError: Unterminated string starting at: line 1 column 1 (char 0)
```

**Expected Behavior**

Serializing CQMs with forward slashes (and some other unicode characters, like NULL) should be forbidden. Or at least such labels should be renamed, either on constraint creation, or cqm serialization.

**Environment**
- any OS, any python
- reproduces with latest `dimod==0.12.12`

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.