File wellmet/wireframe.py changed (mode: 100644) (index 2c83232..ebab43c) |
... |
... |
def convex_sprite(X, couple_indices, tries_to_fix=1, tol=1e-7): |
341 |
341 |
i, j = couple_indices |
i, j = couple_indices |
342 |
342 |
__nsim, ndim = X.shape |
__nsim, ndim = X.shape |
343 |
343 |
|
|
344 |
|
baseline = X[j] - X[i] |
|
345 |
|
|
|
346 |
344 |
# sprite does not mean anything. Just a word |
# sprite does not mean anything. Just a word |
347 |
345 |
#č místo vyslovéné bazi budeme vektory ukladat do |
#č místo vyslovéné bazi budeme vektory ukladat do |
348 |
346 |
#č jakési obecné matici |
#č jakési obecné matici |
|
... |
... |
def convex_sprite(X, couple_indices, tries_to_fix=1, tol=1e-7): |
411 |
409 |
|
|
412 |
410 |
|
|
413 |
411 |
|
|
|
412 |
|
def get_longest(O, A, B): |
|
413 |
|
a_i = O - A |
|
414 |
|
a_j = O - B |
|
415 |
|
if np.inner(a_i[:-1], a_i[:-1]) > np.inner(a_j[:-1], a_j[:-1]): |
|
416 |
|
return a_i |
|
417 |
|
else: |
|
418 |
|
return a_j |
|
419 |
|
|
|
420 |
|
|
|
421 |
|
def convex_slice(X, couple_indices, tries_to_fix=1, tol=1e-7): |
|
422 |
|
i, j = couple_indices |
|
423 |
|
nsim, ndim = X.shape |
|
424 |
|
|
|
425 |
|
mask = np.full(nsim, True) |
|
426 |
|
mask[[i, j]] = False |
|
427 |
|
|
|
428 |
|
#č jako indice zkusme použit bod na usečce uprostřed mezí vzorky |
|
429 |
|
# |
|
430 |
|
#č všechy souřadnice jsou dány radius-vektorem od středu, |
|
431 |
|
#č ale poslední souřadnice je to naše zvednutí, |
|
432 |
|
#č kde bychom mohli zkusit dát korrektnější směr. |
|
433 |
|
#č Mně humpolackými uvahami o tečně paraboly |
|
434 |
|
#č na caru paríru vyšlo něco jako |
|
435 |
|
#č že stačí dát poslední složku 0,5. |
|
436 |
|
#č Jakože čím je roloměr větší, |
|
437 |
|
#č tím je "svislá" složka automaticky měnší. |
|
438 |
|
#č Jakože netřeba ani normalizovat, ani nic "složitě" počítat |
|
439 |
|
half_point = np.mean(X[[i, j]], axis=0) |
|
440 |
|
half_point[-1] = -0.5 |
|
441 |
|
|
|
442 |
|
b = get_offsets(half_point, X) |
|
443 |
|
if (np.max(b[mask]) - np.min(b[[i, j]])) < tol: |
|
444 |
|
return True |
|
445 |
|
|
|
446 |
|
#č nepovedlo. Tak deme na věc |
|
447 |
|
idxs = [] |
|
448 |
|
|
|
449 |
|
# sprite does not mean anything. Just a word |
|
450 |
|
#č místo vyslovéné bazi budeme vektory ukladat do |
|
451 |
|
#č jakési obecné matici |
|
452 |
|
sprite = np.empty((ndim + tries_to_fix, ndim)) |
|
453 |
|
baseline = X[j] - X[i] |
|
454 |
|
sprite[-2] = baseline |
|
455 |
|
sprite[-1] = half_point |
|
456 |
|
|
|
457 |
|
|
|
458 |
|
|
|
459 |
|
for dim in range(1, ndim-1): |
|
460 |
|
basis, __ = np.linalg.qr(sprite[-dim-1:].T) |
|
461 |
|
|
|
462 |
|
# get constrain |
|
463 |
|
a = basis[:, -1] |
|
464 |
|
b = get_offsets(a, X) |
|
465 |
|
#č u kontrol musím taky hlídat, aby argmax nebyl i, nebo j |
|
466 |
|
if (np.max(b[mask]) - np.max(b[[i, j]])) < tol: |
|
467 |
|
print(idxs) |
|
468 |
|
return True |
|
469 |
|
|
|
470 |
|
#else: |
|
471 |
|
idx = np.argmax(b) |
|
472 |
|
idxs.append(idx) |
|
473 |
|
sprite[-dim-1] = get_longest(X[idx], X[i], X[j]) |
|
474 |
|
sprite[-dim-2] = baseline |
|
475 |
|
|
|
476 |
|
|
|
477 |
|
#č tady máme |
|
478 |
|
#č sprite[-ndim+1] = nějaký vektor |
|
479 |
|
#č sprite[-ndim] = baseline |
|
480 |
|
|
|
481 |
|
for t in range(tries_to_fix): |
|
482 |
|
basis, __ = np.linalg.qr(sprite[-ndim-t:].T) |
|
483 |
|
# get constrain |
|
484 |
|
a = basis[:, -1] |
|
485 |
|
b = get_offsets(a, X) |
|
486 |
|
#č u kontrol musím taky hlídat, aby argmax nebyl i, nebo j |
|
487 |
|
if (np.max(b[mask]) - np.max(b[[i, j]])) < tol: |
|
488 |
|
print(idxs) |
|
489 |
|
return True |
|
490 |
|
idx = np.argmax(b) |
|
491 |
|
idxs.append(idx) |
|
492 |
|
sprite[-ndim-t] = get_longest(X[idx], X[i], X[j]) |
|
493 |
|
sprite[-ndim-1-t] = baseline |
|
494 |
|
|
|
495 |
|
assert (sprite[0] == baseline).all() |
|
496 |
|
|
|
497 |
|
basis, __ = np.linalg.qr(sprite.T) |
|
498 |
|
a = basis[:, -1] |
|
499 |
|
b = get_offsets(a, X) |
|
500 |
|
print(idxs) |
|
501 |
|
return (np.max(b[mask]) - np.min(b[[i, j]])) < tol |
|
502 |
|
|
|
503 |
|
|
|
504 |
|
|
414 |
505 |
|
|
415 |
506 |
|
|
416 |
507 |
|
|