From 3f790091275dcb1c3132f414c70581f2f9d27891 Mon Sep 17 00:00:00 2001
From: Recolic Keghart <root@recolic.net>
Date: Tue, 5 Dec 2017 13:30:30 +0800
Subject: [PATCH] Add inverse

---
 __pycache__/quickmap.cpython-36.pyc | Bin 2519 -> 2846 bytes
 quickmap.py                         |  23 ++++++++++++++++-------
 test.py                             |   3 +--
 3 files changed, 17 insertions(+), 9 deletions(-)

diff --git a/__pycache__/quickmap.cpython-36.pyc b/__pycache__/quickmap.cpython-36.pyc
index 5941b8d85c574f82e1cb81064e894656e422ef5d..25d45a96a0002e31058294169d422e749b843198 100644
GIT binary patch
delta 1019
zcmZuw&1(}u6rZ=VyV-1#&DS<*V{6l@rK#E?7DQ;FhY}G#5Q~rm6;dX}ZPRU;45h*>
zIiz4KRD`{I@#0l_5j^?_h#&|-@X)(Q&%W8FQpJS#o8SBTy_uceZ}~Tc()Cozes_7Q
z@i|V&F*)<I-j_Z>*B(TQxW>>ZTIV|uA_#*X0Fgw3MgluX2#|IUr0x=A31o&#Fp~^Y
zLi>}^&Sab*jVhR96r(yQO<idUx~{7ZL6b;O3S}}uHeAw1x;bg`Uo6h-JtB;KV2L8>
z!7^HqXGw{+KxCYM6{gI|yv)kXn#NLx^syGW!4M8`q}$Vg_~k)GMrQx1NDnG3tj?(I
zu&ju&+yY^F5$iG+$q)t#3q)A!aj8j)0>wkMZ)@F_D9DD{2rIF3hXy_$^EL1fGLE=|
z=Ss-5OtH}(J<vr`x-axKU}Ja~>+i$#v;*qTM)i(NM)fqRe?+n2{C^vC9G}{!`#KwE
zWj1j#9%D|AL|aP_){I)&B)hOjf&wEeq;m1-0gVBa!<zmQ#=~R%Mn%Va&a1o5AqcV`
z-E&Wq+Auz9Y=Qd~=+owECtNgU;8OU^*nvv;!?-!*Ry|Q}dw#3Tw*1y?dE@ETYl}xk
zQ-{)Xu3jgeP~ajgqIEO`GyGyUU@5#3dj-|-V{AH;<p#$4bhEjO;Q8Ut*b^v*cdhAe
zBhlIwEuYmMHbv{ysVk?itGRp_JGpvc`<CbLw0Ng=r=d4FuSHmI=qQRDQE|^#-1F;w
zsP&=FN3pSCY~1!e(J(ivp5JWqF{L=Az$RTnDh3}>j+${YZBnrb1?q5p^HxjTYi_GE
zc9szcSYSg5O4LDC&>S;KbtoWLnADV6)I#5a47gz8-+@WZfiikgT;p@7Q?dAX3RmtZ
qNS{Kr8u4ny=9O?IK0i8xnTEaD6x;1B(e_rk`fhnr!Cd$@KK~n1I@q!R

delta 771
zcmY*WO=uHQ5PtLC?&f9xk~T4I)7n%mwGj$}#Uj+3w0N)wMM#5!!AT`;4dr!_DsRbQ
z18Ied@NOPFdlfI<Jb3WvQ3&G2n@2C=L2zE$gDyMs&CZ+o=G%F%D_=_0D^cWEY75QZ
zImW)Te;)5`^&|A;X{JO-6-<!rH-NE(A!GndGYy=jGR-HTWd_<Qv(%?kt|bbc&m6F|
zj;&4jwy-rL%xAVQNW%dP_!dVOy}mqR1GWX2L)n*Uq}`r+gL(A(EO8D2g9(<w4YD-G
zP?N2)#MP0Gb)Z9{h>pcQo)*#~4UBam<G{L-;({HH#l*w0Rfgk)CBib{8Dhw7OU<>Q
z{>rfxncL1=KAgZw>`h_y*rmU8UxHdD-98QWaXJ%6A_;V1AV}>D36%c}%y>FRMB$;(
zV|W&4v39~kxhP|!A@L~|EaDuV>$7wm*&S9tzwxZP-tM+l=b`x~{y@!qb)LhldE~BK
zu=}@nu^*E=9Bn`2nort3*ib%Y%_sK~%$uL?6Ie7I@7lZfo&ZymMOZPH<qNoOKFGzO
zs9dTYipQ-3^Gn``lDV5-><xqVLDKGG<8~`)51ri(shFfXH9@ZFw3KR${ASak#>Non
z-Bi=|(A~M&?IcZaXRXt1?W!5e&i9_GdE0Jv)g3iuV@q{HI%lJR+|XNZC%0OA56bkh
zf0Y~q2|k1(Camz-3xxv}8$-yYkQ7NMLK!@WVUBQ=;cAIG>z;}Tl--ajkXu_DLETpi
S=9Rw;7tLqC3QOjPzx)@+JD<w{

diff --git a/quickmap.py b/quickmap.py
index 13f8d60..b8863c2 100644
--- a/quickmap.py
+++ b/quickmap.py
@@ -17,10 +17,11 @@ def dotMultiply(vctA, vctB):
         ans += a * b
     return ans
 
-def GetMap(parrX, parrY, windowSizeX=12, windowSizeY=8, extendXRate=1, line=False, passO=False, maxXPower=1):
+def GetMap(parrX, parrY, windowSizeX=12, windowSizeY=8, extendXRate=1, extendYRate=1, line=False, passO=False, maxXPower=1, inverseK=False):
     print('Generic-GetMap by Recolic.')
     arrX, arrY = parrX, parrY
-    maxX = max(arrX) * extendXRate
+    maxX, maxY = max(arrX) * extendXRate, max(arrY) * extendYRate
+    minX, minY = min(arrX) * extendXRate, min(arrY) * extendYRate
     # Do calculate
     # y = [k0 k1 k2 ...] dot [x^0 x^1 x^2 ...]
     print('Your input: ', arrX, '|', arrY)
@@ -33,14 +34,18 @@ def GetMap(parrX, parrY, windowSizeX=12, windowSizeY=8, extendXRate=1, line=Fals
             vctX[0] = 0
         return dotMultiply(k, vctX)
 
-    def lossFunc(k, x, y): return lineFunc(k, x) - y
+    def lossFunc(k, x, y): return abs(lineFunc(k, x) - y)
 
     # Fire!
     if line:
         kInit = [1 for _ in range(maxXPower + 1)]
         kInit[0] = 0 # guarantee passO.
-        kFinal, _ = leastsq(lossFunc, kInit, args=(X, Y))
-        print('Fit line done. k=', kFinal)
+        if inverseK:
+            kFinal, _ = leastsq(lossFunc, kInit, args=(Y, X))
+            print('Fit line done. k^-1=', kFinal)
+        else:
+            kFinal, _ = leastsq(lossFunc, kInit, args=(X, Y))
+            print('Fit line done. k=', kFinal)
     else:
         print('Drawing map without fitting a line...')
 
@@ -51,8 +56,12 @@ def GetMap(parrX, parrY, windowSizeX=12, windowSizeY=8, extendXRate=1, line=Fals
     plt.figure(figsize=(windowSizeX, windowSizeY))
     plt.scatter(X, Y, color="red", label="Sample Point", linewidth=3)
     if line:
-        px = numpy.linspace(0, maxX, 1000)
-        py = dotMultiply(kFinal, [px ** power for power in range(maxXPower + 1)])
+        if inverseK:
+            py = numpy.linspace(minY, maxY, 1000)
+            px = dotMultiply(kFinal, [py ** power for power in range(maxXPower + 1)])
+        else:
+            px = numpy.linspace(minX, maxX, 1000)
+            py = dotMultiply(kFinal, [px ** power for power in range(maxXPower + 1)])
         plt.plot(px, py, color="orange", label="Fitting Line", linewidth=2)
     plt.legend()
     plt.grid()
diff --git a/test.py b/test.py
index 86b6559..e65e2ac 100644
--- a/test.py
+++ b/test.py
@@ -3,6 +3,5 @@ import quickmap
 yrc=[-6.77, -6.78, -6.78, -6.76, -6.73, -6.73, -6.72, -6.70, -6.69, -6.67, -6.60, -6.45, -6.37, -6.20, -5.99, -5.77, -5.45, -5.07, -3.52, -2.87, -2.36, -2.08, -1.77, -1.55, -1.40, -1.26, -0.97, -0.84, -0.64]
 xrc=[0.0, 2.0, 4.0, 10.0, 20.0, 22.0, 25.0, 30.0, 33.0, 35.0, 37.0, 38.0, 38.5, 39.0, 39.6, 40.0, 40.5, 41.0, 43.0, 44.0, 45.0, 46.0, 47.0, 48.0, 49.0, 50.0, 53.0, 55.0, 60.0]
 
-for i in range(15):
-    quickmap.GetMap(xrc, yrc, line=True, maxXPower=i, extendXRate=1)
+quickmap.GetMap(xrc, yrc, line=True, maxXPower=16, inverseK=True)
 
-- 
GitLab