diff --git a/light9/effect/settings.py b/light9/effect/settings.py --- a/light9/effect/settings.py +++ b/light9/effect/settings.py @@ -58,10 +58,10 @@ class _Settings(object): return cls(graph, settingsList) @classmethod - def fromVector(cls, graph, vector): + def fromVector(cls, graph, vector, deviceAttrFilter=None): compiled = {} i = 0 - for (d, a) in cls(graph, [])._vectorKeys(): + for (d, a) in cls(graph, [])._vectorKeys(deviceAttrFilter): if a == L9['color']: v = toHex(vector[i:i+3]) i += 3 @@ -87,7 +87,7 @@ class _Settings(object): def _zeroForAttr(self, attr): if attr == L9['color']: return '#000000' - return 0 + return 0.0 def _delZeros(self): for dev, av in self._compiled.items(): @@ -130,7 +130,7 @@ class _Settings(object): def getValue(self, dev, attr): return self._compiled.get(dev, {}).get(attr, self._zeroForAttr(attr)) - def _vectorKeys(self): + def _vectorKeys(self, deviceAttrFilter=None): """stable order of all the dev,attr pairs for this type of settings""" raise NotImplementedError @@ -145,10 +145,9 @@ class _Settings(object): def devices(self): return self._compiled.keys() - def toVector(self): + def toVector(self, deviceAttrFilter=None): out = [] - for dev, attr in self._vectorKeys(): - # color components may need to get spread out + for dev, attr in self._vectorKeys(deviceAttrFilter): v = self.getValue(dev, attr) if attr == L9['color']: out.extend([x / 255 for x in parseHex(v)]) @@ -197,7 +196,7 @@ class _Settings(object): class DeviceSettings(_Settings): - def _vectorKeys(self): + def _vectorKeys(self, deviceAttrFilter=None): with self.graph.currentState() as g: devs = set() # devclass, dev for dc in g.subjects(RDF.type, L9['DeviceClass']): @@ -207,6 +206,9 @@ class DeviceSettings(_Settings): keys = [] for dc, dev in sorted(devs): for attr in sorted(g.objects(dc, L9['deviceAttr'])): - keys.append((dev, attr)) + key = (dev, attr) + if deviceAttrFilter and key not in deviceAttrFilter: + continue + keys.append(key) return keys diff --git a/light9/effect/settings_test.py b/light9/effect/settings_test.py --- a/light9/effect/settings_test.py +++ b/light9/effect/settings_test.py @@ -7,8 +7,8 @@ from light9.effect.settings import Devic class TestDeviceSettings(unittest.TestCase): def setUp(self): - self.graph = LocalSyncedGraph(files=['show/dance2017/cam/test/lightConfig.n3', - 'show/dance2017/cam/test/bg.n3']) + self.graph = LocalSyncedGraph(files=['test/cam/lightConfig.n3', + 'test/cam/bg.n3']) def testToVectorZero(self): ds = DeviceSettings(self.graph, []) diff --git a/light9/paint/solve.py b/light9/paint/solve.py --- a/light9/paint/solve.py +++ b/light9/paint/solve.py @@ -69,7 +69,7 @@ class ImageDistAbs(object): class Solver(object): def __init__(self, graph, sessions=None, imgSize=(100, 75)): self.graph = graph - self.sessions = sessions + self.sessions = sessions # URIs of capture sessions to load self.imgSize = imgSize self.samples = {} # uri: Image array (float 0-255) self.fromPath = {} # imagePath: image array @@ -146,11 +146,11 @@ class Solver(object): saveNumpy('/tmp/sample_paint_%s.png' % len(painting['strokes']), pic0Blur) sampleDist = {} + dist = ImageDist(pic0Blur) for sample, picSample in sorted(self.blurredSamples.items()): #saveNumpy('/tmp/sample_%s.png' % sample.split('/')[-1], # f(picSample)) - dist = self._imgDist(pic0Blur, picSample) - sampleDist[sample] = dist + sampleDist[sample] = dist.distanceTo(picSample) results = [(d, uri) for uri, d in sampleDist.items()] results.sort() @@ -172,37 +172,39 @@ class Solver(object): def solveBrute(self, painting): pic0 = self.draw(painting).astype(numpy.float) - colorSteps = 3 + colorSteps = 2 colorStep = 1. / colorSteps + # use toVector then add ranges dims = [ - (DEV['aura1'], L9['rx'], [slice(.2, .7+.1, .1)]), + (DEV['aura1'], L9['rx'], [slice(.2, .7+.1, .2)]), (DEV['aura1'], L9['ry'], [slice(.573, .573+1, 1)]), (DEV['aura1'], L9['color'], [slice(0, 1 + colorStep, colorStep), slice(0, 1 + colorStep, colorStep), slice(0, 1 + colorStep, colorStep)]), ] - + deviceAttrFilter = [(d, a) for d,a,s in dims] + + dist = ImageDist(pic0) def drawError(x): - settings = DeviceSettings.fromVector(self.graph, x) + settings = DeviceSettings.fromVector(self.graph, x, deviceAttrFilter=deviceAttrFilter) preview = self.combineImages(self.simulationLayers(settings)) - saveNumpy('/tmp/x_%s.png' % abs(hash(settings)), preview) + #saveNumpy('/tmp/x_%s.png' % abs(hash(settings)), preview) - diff = preview.astype(numpy.float) - pic0 - out = scipy.sum(abs(diff)) + out = dist.distanceTo(preview) #print 'measure at', x, 'drawError=', out return out x0, fval, grid, Jout = scipy.optimize.brute( - drawError, - sum([s for dev, da, s in dims], []), + func=drawError, + ranges=sum([s for dev, da, s in dims], []), finish=None, disp=True, full_output=True) if fval > 30000: raise ValueError('solution has error of %s' % fval) - return DeviceSettings.fromVector(self.graph, x0) + return DeviceSettings.fromVector(self.graph, x0, deviceAttrFilter=deviceAttrFilter) def combineImages(self, layers): """make a result image from our self.samples images""" diff --git a/light9/paint/solve_test.py b/light9/paint/solve_test.py --- a/light9/paint/solve_test.py +++ b/light9/paint/solve_test.py @@ -8,16 +8,18 @@ from light9.effect.settings import Devic class TestSolve(unittest.TestCase): def setUp(self): - self.graph = LocalSyncedGraph(files=['show/dance2017/cam/test/lightConfig.n3', - 'show/dance2017/cam/test/bg.n3']) - self.solver = solve.Solver(self.graph, imgSize=(100, 48)) + self.graph = LocalSyncedGraph(files=['test/cam/lightConfig.n3', + 'test/cam/bg.n3']) + self.solver = solve.Solver(self.graph, imgSize=(100, 48), sessions=[L9['session0']]) self.solver.loadSamples() self.solveMethod = self.solver.solve + @unittest.skip('solveBrute unfinished') def testBlack(self): devAttrs = self.solveMethod({'strokes': []}) self.assertEqual(DeviceSettings(self.graph, []), devAttrs) + @unittest.skip("unfinished") def testSingleLightCloseMatch(self): devAttrs = self.solveMethod({'strokes': [{'pts': [[224, 141], [223, 159]], @@ -33,13 +35,13 @@ class TestSolveBrute(TestSolve): super(TestSolveBrute, self).setUp() self.solveMethod = self.solver.solveBrute -CAM_TEST = Namespace('http://light9.bigasterisk.com/show/dance2017/cam/test/') +CAM_TEST = Namespace('http://light9.bigasterisk.com/test/cam/') class TestSimulationLayers(unittest.TestCase): def setUp(self): - self.graph = LocalSyncedGraph(files=['show/dance2017/cam/test/lightConfig.n3', - 'show/dance2017/cam/test/bg.n3']) - self.solver = solve.Solver(self.graph, imgSize=(100, 48)) + self.graph = LocalSyncedGraph(files=['test/cam/lightConfig.n3', + 'test/cam/bg.n3']) + self.solver = solve.Solver(self.graph, imgSize=(100, 48), sessions=[L9['session0']]) self.solver.loadSamples() def testBlack(self): @@ -77,9 +79,9 @@ class TestSimulationLayers(unittest.Test class TestCombineImages(unittest.TestCase): def setUp(self): - graph = LocalSyncedGraph(files=['show/dance2017/cam/test/lightConfig.n3', - 'show/dance2017/cam/test/bg.n3']) - self.solver = solve.Solver(graph, imgSize=(100, 48)) + graph = LocalSyncedGraph(files=['test/cam/lightConfig.n3', + 'test/cam/bg.n3']) + self.solver = solve.Solver(graph, imgSize=(100, 48), sessions=[L9['session0']]) self.solver.loadSamples() def test(self): out = self.solver.combineImages(layers=[ @@ -87,14 +89,14 @@ class TestCombineImages(unittest.TestCas {'path': CAM_TEST['bg2-a.jpg'], 'color': (.888, 0, .3)}, ]) solve.saveNumpy('/tmp/t.png', out) - golden = solve.loadNumpy('show/dance2017/cam/test/layers_out1.png') + golden = solve.loadNumpy('test/cam/layers_out1.png') numpy.testing.assert_array_equal(golden, out) class TestBestMatch(unittest.TestCase): def setUp(self): - graph = LocalSyncedGraph(files=['show/dance2017/cam/test/lightConfig.n3', - 'show/dance2017/cam/test/bg.n3']) - self.solver = solve.Solver(graph, imgSize=(100, 48)) + graph = LocalSyncedGraph(files=['test/cam/lightConfig.n3', + 'test/cam/bg.n3']) + self.solver = solve.Solver(graph, imgSize=(100, 48), sessions=[L9['session0']]) self.solver.loadSamples() def testRightSide(self): @@ -103,4 +105,4 @@ class TestBestMatch(unittest.TestCase): drawImg = self.solver.draw(drawingOnRight) match, dist = self.solver.bestMatch(drawImg) self.assertEqual(L9['sample5'], match) - self.assertAlmostEqual(0.06678758, dist) + self.assertAlmostEqual(0.983855965, dist) diff --git a/light9/rdfdb/graphfile_test.py b/light9/rdfdb/graphfile_test.py --- a/light9/rdfdb/graphfile_test.py +++ b/light9/rdfdb/graphfile_test.py @@ -16,7 +16,7 @@ class TestGraphFileOutput(unittest.TestC def getSubgraph(uri): return Graph() - gf = GraphFile(mock.Mock(), tf.name, URIRef('uri'), mock.Mock(), getSubgraph) + gf = GraphFile(mock.Mock(), tf.name, URIRef('uri'), mock.Mock(), getSubgraph, {}, {}) gf.reread() newGraph = Graph() @@ -27,8 +27,6 @@ class TestGraphFileOutput(unittest.TestC gf.flush() wroteContent = open(tf.name).read() self.assertEqual('''@prefix : . -@prefix dev: . -@prefix effect: . @prefix n: . @prefix rdf: . @prefix rdfs: . diff --git a/light9/web/live/index.html b/light9/web/live/index.html --- a/light9/web/live/index.html +++ b/light9/web/live/index.html @@ -93,7 +93,7 @@

- (device class ) + a