Skip to content

Commit

Permalink
Support simplejson encoding
Browse files Browse the repository at this point in the history
  • Loading branch information
arcondello committed Mar 4, 2019
1 parent dc4eea2 commit dd76c08
Show file tree
Hide file tree
Showing 4 changed files with 39 additions and 1 deletion.
4 changes: 4 additions & 0 deletions dimod/binary_quadratic_model.py
Expand Up @@ -1755,6 +1755,10 @@ def to_serializable(self, use_bytes=False, bias_dtype=np.float32,

return doc

def _asdict(self):
# support simplejson encoding
return self.to_serializable()

@classmethod
def _from_serializable_v1(cls, obj):
# deprecated
Expand Down
4 changes: 4 additions & 0 deletions dimod/sampleset.py
Expand Up @@ -1080,6 +1080,10 @@ def to_serializable(self, use_bytes=False, bytes_type=bytes):
"variable_labels": list(self.variables),
"use_bytes": bool(use_bytes)}

def _asdict(self):
# support simplejson encoding
return self.to_serializable()

@classmethod
def from_serializable(cls, obj):
"""Deserialize a :class:`SampleSet`.
Expand Down
1 change: 1 addition & 0 deletions requirements.txt
Expand Up @@ -7,6 +7,7 @@ jsonschema==2.6.0
networkx==2.0
pandas==0.23.4; python_version!="3.4"
mock==2.0.0
simplejson==3.16.0

cython

Expand Down
31 changes: 30 additions & 1 deletion tests/test_serialization_json.py
Expand Up @@ -18,9 +18,16 @@

import numpy as np

try:
import simplejson
except ImportError:
_simplejson = False
else:
_simplejson = True

import dimod

from dimod.serialization.json import DimodEncoder, DimodDecoder
from dimod.serialization.json import DimodEncoder, DimodDecoder, dimod_object_hook


class TestEncode(unittest.TestCase):
Expand Down Expand Up @@ -90,3 +97,25 @@ def test_all_three(self):

new = json.loads(json.dumps(obj, cls=DimodEncoder), cls=DimodDecoder)
self.assertEqual(obj, new)


@unittest.skipUnless(_simplejson, "simplejson is not installed")
class TestSimpleJson(unittest.TestCase):
def test_all_three_functional(self):
builtin = [0, 'a', [0, 'a']]

num_variables = 100
num_samples = 100
samples = 2*np.triu(np.ones((num_samples, num_variables)), -4) - 1
bqm = dimod.BinaryQuadraticModel.from_ising({v: .1*v for v in range(num_variables)}, {})
sampleset = dimod.SampleSet.from_samples_bqm(samples, bqm)

linear = {'a': -1, 4: 1, ('a', "complex key"): 3}
quadratic = {('a', 'c'): 3, ('b', 'c'): -3., ('a', 3): -1}
bqm = dimod.BinaryQuadraticModel(linear, quadratic, 3, dimod.SPIN)

obj = [builtin, sampleset, bqm]

# no encoder, uses ._asdict
new = simplejson.loads(simplejson.dumps(obj), object_hook=dimod_object_hook)
self.assertEqual(obj, new)

0 comments on commit dd76c08

Please sign in to comment.