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
from grid.DDD import random_grid
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
try:
total_points = int(sys.argv[1])
@ -10,7 +11,7 @@ except:
total_points = 20
print total_points
log.info(total_points)
g = random_grid(total_points)
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 os import remove
import numpy as np
FILE_PREFIX='/tmp/qhull-'
for g in glob('%s*' % FILE_PREFIX):
remove(g)
try:
total_points = int(sys.argv[1])
total_tries = int(sys.argv[2])
total_points = int(sys.argv[1])
random_points = int(sys.argv[2])
total_tries = int(sys.argv[3])
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)
@ -25,18 +28,19 @@ print "total points", total_points
d = {True: 0, False: 0}
for i in xrange(total_tries):
for cur_try in xrange(total_tries):
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]
exact = exact_func(X)
try:
answer = g.run_baker(X)
d[improved_answer(answer, exact)] += 1
except smberror as e:
print e
print d
try:
answer = g.run_baker(X)
d[improved_answer(answer, exact)] += 1
except smberror as e:
print e
print d
print d

View File

@ -24,9 +24,8 @@ q = [exact_func(i) for i in verts]
g = grid(verts,q)
X = [0.3, 0.3]
X = [0.13206472640187261, 0.98644929172054607]
g.get_containing_simplex(X)
exact = exact_func(X)
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.tools import logging as log
import numpy as np
import sys
@ -30,7 +31,7 @@ def get_phis(X, R):
phi = np.linalg.solve(A,b)
except np.linalg.LinAlgError as 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)
phi = np.dot(np.linalg.pinv(A), b)
@ -136,7 +137,7 @@ def get_error_quadratic(phi, R, S):
+ b * phi[1] * phi[2]\
+ c * phi[2] * phi[0]
return error_term, a, b, c
return error_term
def get_error_cubic(phi, R, S):
B = [] # baker eq 9
@ -181,7 +182,7 @@ def get_error_cubic(phi, R, S):
+ f * phi[2] * phi[1] * phi[1]\
+ g * phi[0] * phi[1] * phi[2]\
return error_term, a, b, c
return error_term
def run_baker(X, R, S, order=2):
@ -195,37 +196,29 @@ def run_baker(X, R, S, order=2):
S = extra points
"""
answer = {
'qlin': None,
'error': None,
'final': None,
}
# calculate values only for the simplex triangle
phi, qlin = qlinear(X, R)
if len(S.points) == 0:
answer = {
'a': None,
'b': None,
'c': None,
'qlin': qlin,
'error': None,
'final': None,
}
if order == 1:
answer['qlin'] = qlin
return answer
if order == 2:
error_term, a, b, c = get_error_quadratic(phi, R, S)
elif order == 2:
error_term = get_error_quadratic(phi, R, S)
elif order == 3:
error_term, a, b, c = get_error_cubic(phi, R, S)
error_term = get_error_cubic(phi, R, S)
else:
raise smberror('unacceptable order for baker method')
q_final = qlin + error_term
answer = {
'a': a,
'b': b,
'c': c,
'qlin': qlin,
'error': error_term,
'final': q_final,
}
answer['qlin' ] = qlin
answer['error'] = error_term
answer['final'] = q_final
return answer
@ -243,14 +236,6 @@ def run_baker_3D(X, R, S):
# calculate values only for the triangle
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:
answer = {
'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
class smberror(Exception):
"""
this is a silly little exception subclass

View File

@ -61,6 +61,15 @@ class random_grid(rect_grid):
q = []
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):
cur_x = r.rand()

View File

@ -6,7 +6,7 @@ import numpy as np
import scipy.spatial
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 smcqdelaunay import *
@ -42,7 +42,7 @@ class grid(object):
self.tree = scipy.spatial.KDTree(self.points)
self.faces = {}
self.facets_for_point = defaultdict(list)
self.counter = 0
def create_mesh(self, indicies):
p = [self.points[i] for i in indicies]
@ -50,7 +50,45 @@ class grid(object):
return grid(p, q)
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):
@ -64,9 +102,8 @@ class grid(object):
"""
(dist, indicies) = self.tree.query(X, simplex_size + extra_points)
# get the containing simplex
r_mesh = self.create_mesh(indicies[:simplex_size])
# r_mesh = self.create_mesh(indicies[:simplex_size])
r_mesh = self.get_containing_simplex(X)
# and some extra points
s_mesh = self.create_mesh(indicies[simplex_size:])
@ -103,7 +140,7 @@ class grid(object):
if not simplex:
raise AssertionError('no containing simplex found')
R = self.create_mesh(simplex.verts)
R = get_containing_simplex(X)# self.create_mesh(simplex.verts)
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
"""
logging.debug('calling construct_connectivity')
qdelaunay_string = get_qdelaunay_dump_str(self)
facet_to_facets = []
for matcher in grid.facet_re.finditer(qdelaunay_string):