working on the containing simplex problem. the get containing simplex function works, if the point is in the domain. I am trying to force the domain to contain the point (placing points along perimiter of the mesh). I am not doing that right, but have to run

--HG--
rename : bin/qhull-029.txt => data/qhull-029.txt
rename : bin/qhull-029.txt.gv => data/qhull-029.txt.gv
This commit is contained in:
Stephen Mardson McQuay 2010-04-24 18:26:44 -06:00
parent cfcd1e15a2
commit 3dcc10ea0e
10 changed files with 604 additions and 56 deletions

View File

@ -3,6 +3,7 @@
import sys import sys
from grid.DDD import random_grid from grid.DDD import random_grid
from baker import get_phis_3D, run_baker_3D from baker import get_phis_3D, run_baker_3D
from baker.tools import logging as log
from baker.tools import exact_func_3D, smberror, improved_answer from baker.tools import exact_func_3D, smberror, improved_answer
try: try:
total_points = int(sys.argv[1]) total_points = int(sys.argv[1])
@ -10,7 +11,7 @@ except:
total_points = 20 total_points = 20
print total_points log.info(total_points)
g = random_grid(total_points) g = random_grid(total_points)
open('/tmp/for_qhull.txt', 'w').write(g.for_qhull()) open('/tmp/for_qhull.txt', 'w').write(g.for_qhull())

View File

@ -7,16 +7,19 @@ from baker.tools import exact_func, smberror, improved_answer
from glob import glob from glob import glob
from os import remove from os import remove
import numpy as np
FILE_PREFIX='/tmp/qhull-' FILE_PREFIX='/tmp/qhull-'
for g in glob('%s*' % FILE_PREFIX): for g in glob('%s*' % FILE_PREFIX):
remove(g) remove(g)
try: try:
total_points = int(sys.argv[1]) total_points = int(sys.argv[1])
total_tries = int(sys.argv[2]) random_points = int(sys.argv[2])
total_tries = int(sys.argv[3])
except: except:
print "usage: app.py total_points total_tries" print "usage: app.py [total points in random grid] [number of random points to attempt] [total attempts]"
sys.exit(1) sys.exit(1)
@ -25,18 +28,19 @@ print "total points", total_points
d = {True: 0, False: 0} d = {True: 0, False: 0}
for i in xrange(total_tries): for cur_try in xrange(total_tries):
g = random_grid(total_points) g = random_grid(total_points)
open('%s%0.3d.txt' % (FILE_PREFIX, cur_try), 'w').write(g.for_qhull())
open('%s%0.3d.txt' % (FILE_PREFIX, i), 'w').write(g.for_qhull()) for i in xrange(random_points):
X = [np.random.rand(), np.random.rand()]
exact = exact_func(X)
X = [0.3, 0.3] try:
exact = exact_func(X) answer = g.run_baker(X)
d[improved_answer(answer, exact)] += 1
except smberror as e:
print e
print d
try: print d
answer = g.run_baker(X)
d[improved_answer(answer, exact)] += 1
except smberror as e:
print e
print d

View File

@ -24,9 +24,8 @@ q = [exact_func(i) for i in verts]
g = grid(verts,q) g = grid(verts,q)
X = [0.3, 0.3] X = [0.13206472640187261, 0.98644929172054607]
g.get_containing_simplex(X)
exact = exact_func(X) exact = exact_func(X)
try: try:

502
data/qhull-000.txt Normal file
View File

@ -0,0 +1,502 @@
2
500
0.501822 0.099459
0.398871 0.145078
0.717727 0.819884
0.218163 0.456135
0.692657 0.874376
0.698942 0.726672
0.514508 0.713024
0.635646 0.506584
0.838798 0.506751
0.090156 0.534329
0.763002 0.330018
0.325797 0.177421
0.929666 0.349459
0.903110 0.758269
0.788727 0.796974
0.827882 0.283563
0.932292 0.840258
0.730115 0.024117
0.050927 0.682638
0.340828 0.344778
0.265962 0.860156
0.254063 0.747634
0.066011 0.086948
0.124991 0.722423
0.774609 0.825563
0.743862 0.624939
0.587882 0.527069
0.003707 0.400760
0.606581 0.508782
0.733931 0.823112
0.875321 0.387433
0.421334 0.179495
0.487737 0.244955
0.986045 0.549714
0.803826 0.122495
0.513748 0.295921
0.862030 0.670105
0.855385 0.848034
0.254363 0.034489
0.244426 0.550130
0.039767 0.946977
0.324643 0.651447
0.325729 0.827348
0.209335 0.544249
0.579131 0.622810
0.174603 0.157842
0.872530 0.154341
0.588218 0.573515
0.259025 0.733801
0.573148 0.073529
0.781172 0.728942
0.995370 0.779436
0.002421 0.341314
0.288521 0.965963
0.947036 0.016416
0.548763 0.242006
0.138231 0.932469
0.695652 0.832567
0.553380 0.794949
0.495854 0.870735
0.336602 0.132771
0.682331 0.430044
0.475190 0.954946
0.294329 0.497394
0.180446 0.687540
0.627226 0.322490
0.107537 0.650209
0.325204 0.625028
0.883858 0.984149
0.472804 0.533670
0.906653 0.295008
0.463240 0.246410
0.313726 0.493177
0.613654 0.141180
0.567792 0.034890
0.294997 0.296258
0.432614 0.445397
0.656278 0.341600
0.358028 0.681119
0.322254 0.325132
0.954686 0.952094
0.219197 0.059499
0.973052 0.038154
0.079889 0.703179
0.953068 0.369875
0.781529 0.466225
0.156998 0.618783
0.504962 0.588302
0.036981 0.711112
0.225776 0.494560
0.595356 0.032457
0.287397 0.647716
0.555859 0.800712
0.103839 0.396361
0.856306 0.169453
0.899026 0.579813
0.253680 0.732919
0.934093 0.780840
0.052220 0.267688
0.088222 0.827587
0.024444 0.578090
0.771479 0.741172
0.472561 0.162611
0.830357 0.115662
0.832320 0.364346
0.853613 0.047028
0.261261 0.744922
0.635028 0.241084
0.975904 0.320519
0.247161 0.979842
0.227195 0.664762
0.414410 0.678235
0.849322 0.057320
0.889820 0.773301
0.852028 0.219397
0.961608 0.956863
0.780950 0.161184
0.984412 0.948117
0.109250 0.003821
0.828057 0.102844
0.882761 0.392760
0.482812 0.284440
0.897279 0.752738
0.783414 0.125775
0.137902 0.965423
0.443151 0.894608
0.602202 0.120583
0.902763 0.527426
0.052316 0.440764
0.181373 0.671437
0.340350 0.361405
0.761933 0.780775
0.337599 0.242759
0.672853 0.540019
0.606246 0.113563
0.666268 0.990161
0.519951 0.759898
0.464147 0.660421
0.907478 0.106734
0.959816 0.896417
0.350590 0.283244
0.844312 0.342034
0.780929 0.692151
0.937083 0.711286
0.042409 0.901348
0.830176 0.200075
0.532453 0.391126
0.737095 0.328319
0.386647 0.824122
0.770762 0.234036
0.090658 0.794761
0.542149 0.652688
0.447155 0.403339
0.393642 0.302263
0.419523 0.642328
0.164542 0.013951
0.480443 0.505623
0.824197 0.518905
0.462652 0.864183
0.442192 0.980663
0.249635 0.157728
0.236748 0.711805
0.806916 0.851598
0.968949 0.659096
0.061502 0.498107
0.197414 0.645504
0.435848 0.921071
0.758112 0.038039
0.723839 0.350983
0.745719 0.558800
0.391832 0.771099
0.015951 0.379046
0.076760 0.583620
0.779949 0.715885
0.378045 0.961058
0.208069 0.476748
0.525158 0.050896
0.429921 0.754940
0.324172 0.825312
0.338008 0.128663
0.515633 0.738803
0.287414 0.276497
0.525973 0.061000
0.975127 0.625654
0.140107 0.734905
0.671401 0.789625
0.695956 0.098697
0.930942 0.698302
0.334685 0.738623
0.603622 0.716263
0.879529 0.306514
0.115903 0.967280
0.746742 0.843177
0.713765 0.886153
0.115388 0.333187
0.626863 0.175279
0.648830 0.067674
0.322128 0.191630
0.843209 0.929941
0.113607 0.429130
0.764912 0.949248
0.853386 0.604863
0.802790 0.303906
0.077434 0.340228
0.958669 0.742775
0.659572 0.005397
0.981930 0.649579
0.638143 0.652816
0.294420 0.963091
0.692114 0.081922
0.102524 0.420897
0.852326 0.646664
0.569550 0.608715
0.109439 0.207973
0.921732 0.071777
0.480585 0.712810
0.087866 0.027396
0.482599 0.864175
0.119039 0.355474
0.560596 0.391998
0.765300 0.861846
0.755712 0.392778
0.415602 0.117571
0.111080 0.486659
0.673324 0.986224
0.707238 0.020572
0.347888 0.484752
0.770161 0.468600
0.667128 0.574563
0.296673 0.036848
0.463483 0.049365
0.157612 0.089058
0.853492 0.621741
0.354271 0.059681
0.074932 0.665053
0.576566 0.385005
0.677528 0.653185
0.975808 0.765341
0.182598 0.836122
0.934129 0.413901
0.715217 0.526190
0.524517 0.970114
0.462338 0.496160
0.172289 0.911521
0.052674 0.448721
0.130097 0.741582
0.220472 0.096307
0.170737 0.859070
0.988636 0.191693
0.303820 0.151587
0.639676 0.628261
0.422134 0.222226
0.499111 0.458441
0.832883 0.971754
0.996332 0.280903
0.404805 0.347382
0.219804 0.815241
0.872310 0.039327
0.085328 0.117189
0.034204 0.162739
0.122386 0.387208
0.221209 0.315134
0.490247 0.692898
0.244592 0.911100
0.274404 0.544079
0.897967 0.654600
0.723768 0.098982
0.215147 0.464956
0.295471 0.199515
0.785139 0.102539
0.915978 0.678969
0.485031 0.737332
0.396784 0.937990
0.295549 0.911359
0.817506 0.697086
0.558902 0.825836
0.990089 0.854087
0.680328 0.660951
0.190960 0.255092
0.227429 0.906142
0.840200 0.232338
0.412978 0.003388
0.281234 0.702691
0.606999 0.359344
0.142862 0.809069
0.095922 0.259706
0.678389 0.998062
0.085304 0.556810
0.778608 0.391243
0.376031 0.954876
0.585315 0.829717
0.632199 0.555069
0.992517 0.210612
0.851749 0.815774
0.929535 0.214854
0.737507 0.910058
0.593620 0.223300
0.483844 0.063215
0.797046 0.674707
0.002823 0.276132
0.212396 0.760201
0.226260 0.110551
0.331908 0.002332
0.683207 0.797607
0.218008 0.399797
0.811012 0.770548
0.513188 0.444371
0.547434 0.449839
0.421245 0.608438
0.294447 0.275174
0.804497 0.425950
0.475786 0.468890
0.758350 0.751438
0.947073 0.186788
0.680574 0.273894
0.816370 0.779451
0.808707 0.992098
0.597573 0.280983
0.992554 0.351677
0.296248 0.313174
0.289828 0.714345
0.904771 0.832176
0.968310 0.490132
0.870036 0.021450
0.376132 0.170474
0.377137 0.223095
0.055540 0.426383
0.147409 0.741300
0.300452 0.108651
0.032884 0.313330
0.867730 0.276854
0.484683 0.581226
0.271740 0.187032
0.802124 0.885425
0.467229 0.098781
0.925030 0.484433
0.929984 0.772211
0.349099 0.123479
0.678556 0.241998
0.584291 0.283861
0.621535 0.769794
0.712339 0.869903
0.121415 0.362363
0.139690 0.576022
0.623300 0.284221
0.874903 0.308943
0.050968 0.315062
0.415732 0.861086
0.269109 0.632107
0.915507 0.504078
0.263057 0.955175
0.080084 0.384505
0.825620 0.145982
0.696184 0.599655
0.041665 0.753284
0.935032 0.058134
0.919558 0.320587
0.996719 0.935324
0.034179 0.175121
0.853912 0.697859
0.237573 0.737667
0.267024 0.466481
0.752191 0.412488
0.573358 0.776042
0.117738 0.008809
0.391351 0.799168
0.351743 0.448648
0.662856 0.038363
0.155716 0.234058
0.138554 0.485890
0.172528 0.261335
0.667910 0.841149
0.704714 0.702788
0.326822 0.296431
0.165563 0.696065
0.535877 0.037066
0.790105 0.399294
0.863059 0.179309
0.946292 0.349932
0.190070 0.030322
0.548990 0.765724
0.189105 0.326289
0.593151 0.625304
0.080545 0.071429
0.609873 0.315857
0.065005 0.557161
0.172772 0.854238
0.236891 0.340104
0.243522 0.490912
0.521110 0.131008
0.265345 0.106485
0.556598 0.480571
0.583463 0.318790
0.422577 0.524559
0.047355 0.832263
0.015258 0.359675
0.087080 0.749055
0.586842 0.711002
0.500708 0.511499
0.906278 0.753350
0.191065 0.742964
0.850002 0.747699
0.810984 0.958665
0.745445 0.101771
0.812433 0.356154
0.349673 0.482697
0.309605 0.448379
0.906286 0.305023
0.871195 0.236735
0.880085 0.619723
0.252215 0.218488
0.501502 0.938435
0.571883 0.839314
0.491132 0.508797
0.613232 0.418147
0.838755 0.849814
0.319751 0.694594
0.102121 0.280414
0.493146 0.520976
0.080032 0.935737
0.978841 0.426193
0.572612 0.929880
0.562613 0.788561
0.162098 0.497810
0.187087 0.439069
0.080479 0.414313
0.900542 0.203189
0.746217 0.777058
0.733827 0.872460
0.735957 0.728743
0.129533 0.625628
0.579763 0.036779
0.481897 0.045606
0.909063 0.879236
0.415542 0.769329
0.550507 0.500253
0.726148 0.975612
0.000193 0.603004
0.487489 0.695720
0.954665 0.714453
0.362283 0.292757
0.948384 0.300804
0.395100 0.822704
0.135503 0.304895
0.592481 0.260597
0.021018 0.757291
0.592562 0.782326
0.138078 0.735031
0.638480 0.457732
0.587009 0.255635
0.355952 0.747673
0.721680 0.346664
0.302100 0.822532
0.451586 0.424316
0.795754 0.368634
0.074531 0.085938
0.171169 0.610738
0.169327 0.627517
0.170210 0.139028
0.716423 0.333147
0.757550 0.343675
0.547498 0.134499
0.797433 0.285402
0.056388 0.965889
0.876258 0.041214
0.940046 0.599479
0.414035 0.393592
0.240744 0.965824
0.848756 0.776561
0.699504 0.236643
0.378730 0.003658
0.659677 0.101798
0.855023 0.541043
0.206409 0.835201
0.864257 0.742651
0.507091 0.737711
0.278080 0.176298
0.439871 0.586918
0.325005 0.662985
0.898581 0.664883
0.973856 0.807850
0.767325 0.718386
0.616289 0.183717
0.002939 0.230201
0.925781 0.241950
0.500550 0.574635
0.622247 0.624035
0.260977 0.344729
0.644911 0.765267
0.253137 0.819781
0.241926 0.709515
0.359244 0.740632
0.109408 0.105881
0.306583 0.231504
0.197410 0.586292
0.066206 0.518310
0.375724 0.151438
0.459500 0.107776
0.088232 0.245200
0.558558 0.076231

View File

@ -1,4 +1,5 @@
from baker import * from baker import *
from baker.tools import logging as log
import numpy as np import numpy as np
import sys import sys
@ -30,7 +31,7 @@ def get_phis(X, R):
phi = np.linalg.solve(A,b) phi = np.linalg.solve(A,b)
except np.linalg.LinAlgError as e: except np.linalg.LinAlgError as e:
msg = "warning: get_phis: calculation of phis yielded a linearly dependant system (%s)" % e msg = "warning: get_phis: calculation of phis yielded a linearly dependant system (%s)" % e
# TODO: log this -- > print >> sys.stderr, msg log.error(msg)
raise smberror(msg) raise smberror(msg)
phi = np.dot(np.linalg.pinv(A), b) phi = np.dot(np.linalg.pinv(A), b)
@ -136,7 +137,7 @@ def get_error_quadratic(phi, R, S):
+ b * phi[1] * phi[2]\ + b * phi[1] * phi[2]\
+ c * phi[2] * phi[0] + c * phi[2] * phi[0]
return error_term, a, b, c return error_term
def get_error_cubic(phi, R, S): def get_error_cubic(phi, R, S):
B = [] # baker eq 9 B = [] # baker eq 9
@ -181,7 +182,7 @@ def get_error_cubic(phi, R, S):
+ f * phi[2] * phi[1] * phi[1]\ + f * phi[2] * phi[1] * phi[1]\
+ g * phi[0] * phi[1] * phi[2]\ + g * phi[0] * phi[1] * phi[2]\
return error_term, a, b, c return error_term
def run_baker(X, R, S, order=2): def run_baker(X, R, S, order=2):
@ -195,37 +196,29 @@ def run_baker(X, R, S, order=2):
S = extra points S = extra points
""" """
answer = {
'qlin': None,
'error': None,
'final': None,
}
# calculate values only for the simplex triangle # calculate values only for the simplex triangle
phi, qlin = qlinear(X, R) phi, qlin = qlinear(X, R)
if len(S.points) == 0: if order == 1:
answer = { answer['qlin'] = qlin
'a': None,
'b': None,
'c': None,
'qlin': qlin,
'error': None,
'final': None,
}
return answer return answer
elif order == 2:
if order == 2: error_term = get_error_quadratic(phi, R, S)
error_term, a, b, c = get_error_quadratic(phi, R, S)
elif order == 3: elif order == 3:
error_term, a, b, c = get_error_cubic(phi, R, S) error_term = get_error_cubic(phi, R, S)
else: else:
raise smberror('unacceptable order for baker method') raise smberror('unacceptable order for baker method')
q_final = qlin + error_term q_final = qlin + error_term
answer = { answer['qlin' ] = qlin
'a': a, answer['error'] = error_term
'b': b, answer['final'] = q_final
'c': c,
'qlin': qlin,
'error': error_term,
'final': q_final,
}
return answer return answer
@ -243,14 +236,6 @@ def run_baker_3D(X, R, S):
# calculate values only for the triangle # calculate values only for the triangle
phi, qlin = qlinear_3D(X, R) phi, qlin = qlinear_3D(X, R)
if [i for i in phi if i <= 0.0]:
s = "this is not a containing simplex:\n"
s += " X: %s\n" % X
s += " R: %s\n" % R
s += " phi: %s, sum(%0.4e)\n" % (phi, sum(phi))
print >> sys.stderr, s
raise smberror("not containing simplex")
if len(S.points) == 0: if len(S.points) == 0:
answer = { answer = {
'a': None, 'a': None,

View File

@ -1,5 +1,15 @@
import os
import logging
logging.basicConfig(
level = logging.DEBUG,
format = '%(asctime)s %(levelname)s %(message)s',
filename = os.path.join(os.sep, 'tmp', 'baker.lol'),
)
import numpy as np import numpy as np
class smberror(Exception): class smberror(Exception):
""" """
this is a silly little exception subclass this is a silly little exception subclass

View File

@ -61,6 +61,15 @@ class random_grid(rect_grid):
q = [] q = []
r = np.random r = np.random
appx_side_res = int(np.sqrt(num_points))
delta = 1.0 / float(appx_side_res)
for x in xrange(appx_side_res):
cur_x = x * delta
for y in xrange(appx_side_res):
cur_y = y * delta
new_point = [cur_x, cur_y]
points.append(new_point)
q.append(exact_func(new_point))
for i in xrange(num_points): for i in xrange(num_points):
cur_x = r.rand() cur_x = r.rand()

View File

@ -6,7 +6,7 @@ import numpy as np
import scipy.spatial import scipy.spatial
from baker import run_baker from baker import run_baker
from baker.tools import exact_func, smberror from baker.tools import exact_func, smberror, logging
from simplex import face, contains from simplex import face, contains
from smcqdelaunay import * from smcqdelaunay import *
@ -42,7 +42,7 @@ class grid(object):
self.tree = scipy.spatial.KDTree(self.points) self.tree = scipy.spatial.KDTree(self.points)
self.faces = {} self.faces = {}
self.facets_for_point = defaultdict(list) self.facets_for_point = defaultdict(list)
self.counter = 0
def create_mesh(self, indicies): def create_mesh(self, indicies):
p = [self.points[i] for i in indicies] p = [self.points[i] for i in indicies]
@ -50,7 +50,45 @@ class grid(object):
return grid(p, q) return grid(p, q)
def get_containing_simplex(self, X): def get_containing_simplex(self, X):
pass if not self.faces:
logging.debug('get_containing_simplex: setting up connectivity')
self.construct_connectivity()
# get closest point
(dist, indicies) = self.tree.query(X, 2)
closest_point = indicies[0]
logging.debug('counter: %d' % self.counter)
self.counter += 1
logging.debug('X: %s' % X)
logging.debug('point index: %d' % closest_point)
logging.debug('actual point %s' % self.points[closest_point])
logging.debug('distance = %0.4f' % dist[0])
simplex = None
checked_facets = []
facets_to_check = self.facets_for_point[closest_point]
attempts = 0
while not simplex:
logging.debug('attempt: %d' % attempts)
attempts += 1
if attempts > 10:
raise smberror("probably recursing to many times")
cur_facet = facets_to_check.pop()
checked_facets.append(cur_facet)
facets_to_check.extend([i for i in cur_facet.neighbors if i not in checked_facets])
if cur_facet.contains(X, self):
simplex = cur_facet
if not simplex:
raise AssertionError('no containing simplex found')
R = self.create_mesh(simplex.verts)
logging.debug('this must be R: %s' % R)
return R
def get_simplex_and_nearest_points(self, X, extra_points = 3, simplex_size = 3): def get_simplex_and_nearest_points(self, X, extra_points = 3, simplex_size = 3):
@ -64,9 +102,8 @@ class grid(object):
""" """
(dist, indicies) = self.tree.query(X, simplex_size + extra_points) (dist, indicies) = self.tree.query(X, simplex_size + extra_points)
# r_mesh = self.create_mesh(indicies[:simplex_size])
# get the containing simplex r_mesh = self.get_containing_simplex(X)
r_mesh = self.create_mesh(indicies[:simplex_size])
# and some extra points # and some extra points
s_mesh = self.create_mesh(indicies[simplex_size:]) s_mesh = self.create_mesh(indicies[simplex_size:])
@ -103,7 +140,7 @@ class grid(object):
if not simplex: if not simplex:
raise AssertionError('no containing simplex found') raise AssertionError('no containing simplex found')
R = self.create_mesh(simplex.verts) R = get_containing_simplex(X)# self.create_mesh(simplex.verts)
s = [] s = []
@ -136,6 +173,7 @@ class grid(object):
this is part of the __init__ for a rect_grid, but can be called from any grid object this is part of the __init__ for a rect_grid, but can be called from any grid object
""" """
logging.debug('calling construct_connectivity')
qdelaunay_string = get_qdelaunay_dump_str(self) qdelaunay_string = get_qdelaunay_dump_str(self)
facet_to_facets = [] facet_to_facets = []
for matcher in grid.facet_re.finditer(qdelaunay_string): for matcher in grid.facet_re.finditer(qdelaunay_string):