From 3b30480191802d9fc0d3707940a8ad30384436e2 Mon Sep 17 00:00:00 2001 From: Dhvani Patel Date: Tue, 1 Aug 2017 08:58:38 -0600 Subject: [PATCH] Fixed up py_mutations_hub.py --- .gitignore | 1 + __pycache__/toCheck.pypy-41.pyc | Bin 15515 -> 5157 bytes keras_model.py | 43 +- py_mutations_hub.py | 165 +++++--- py_mutations_hub.pyc | Bin 10628 -> 10788 bytes toCheck.py | 694 ++++++-------------------------- 6 files changed, 254 insertions(+), 649 deletions(-) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d4c48ab --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +train_pre_data.txt diff --git a/__pycache__/toCheck.pypy-41.pyc b/__pycache__/toCheck.pypy-41.pyc index 7002a4437dfb5f9e9608ffbaaf31b3e5d7cc0277..61daed2ff9662bbb1b4c2cbc738f4f68b28473eb 100644 GIT binary patch literal 5157 zcmb_gZEqXL5uQ6z6iG>zlE98#J1LVE4OWX_~-Ha(3aGUk)eUNg{Q} zV{VtR6*NTw6@B?ob3=9!tj=6~0kzy8;s zpY^2tSK;4X5%VYfjq%@;R3!7H>xsvAUs7MPigYWIRi#^X)QY4_lGUVJ!+TZYB}tbh zt4p^oSwp%F$(qt_O12{170FhmyDHh5bl1RLlcXm5p2W-Y7m*W@XWc6j*X41$fi3j$ zNZUhW*U?0KCQrvU3H#Y7FKpZAzzUlp8k(qQ`}xpb!TaxqHaRHz_V{5@!w(nloF#gFfd6Kh%STof!7x#Ce<=>){2$c)n;`m*k8fT|MRkH(a zRX$>y0`0L=m*8=G8M1nm%!e=ccd^1B(Xnbr$b%%vI1wMz&=a%+PfmUL z29ruAtOBOmgsGxTl_?W;vs})Dji9@@AyCwbR4CF7El;>(ffcFLj;*2{MpAZFXc(&rM`}Wjnxyz5G2vlu!?FeUZ5L?SL+! z#3#i#QRyEo78{Vcwbz zs{IwBk%1BH!_NUC)oqcCir^|{1_Vk#>#GW9bL|_TxoJVvH;H)!H;E1sXCIpNL7tdS zZXdqr8ymb1f+9V*#vUHm1l*pB64-NikXS&Pq75BE{9E{4a|WS5ObzlMybvO;^(6F5 z&p(BRffyR3N(?xr0bp>(Skp022L3r?RVR}sXc{a}3<*e5U|qr*JF_L~QZAte_AE@> zl+zVL+D#a&Vqe}@I=`GYU3y8ys|PTybf!$mD`RizJ&JfIKp$PsBI<%M~7$$dq0{9-BK`^k3F@#QF7Y?H_`M}{= z?L&E;SHWMP5$69f(Mw_PQsNAEpN*5^7^+a%s%nE4wx>Fc($qy!!YD7|qzLzpF9)Ck zoB+(CAwXP&nEw;Z)RZ9p>t3^Z)vGwQ(q#JVV*DQnyMGg{5j^>;2pt@H^X2afPT=K4 zJddQxBB^>gX)5mo(1AUi?*nQ`T?36v|3pzY z4T~y)ID94lZgZ76!0T&^w0F?B;*LRW6ctfs&Uv7V{>(EjlQ8~=v(WZS445h!0i?Cg z(`Xik{WuJh7bqzaXCa!^1&LZsly5rhvKPTOKYMg^!R*nIWhyFXvm6RTB+qA5A+bUnIf;_ZKmWfoY$D8F)kQ{dKlT~ zN1Opz(9csxM;i0hFjF(N882K0&|JVp9F5gLz;qXEk%njPRL(sXViTO?7vM8LCAYU; zdBfvxqkPz3^GPLTzSXjhy5v*Yg@hfzWE!YYYa<;n@Vh*X>f6;4gpR8h5Y04_p@#Fy zpi!L*8ZI)`1ogrM?i14F-J$jjiwjm4k|wiU@H)fN(2ZX};yulUn&u+Q%2|>{+0u~H zro?jtJU*@#xL2%bDODbSRaw_aLUg1CVwS9|0XmxGH1B+bqVMM*-E)_-yDbp3V0o^W zwN_-$m$WnI*_mRC2GYp&19Z6lBx@sbA&Dbw%@Vin!iBAGy|5PE!4I)mz*yzdD0}<; z6orPvSsU*cB97i%BF^!L?y%+=21?jn^@44@1-IGUVZ+V3@`%o?HBuiPX%kUe{%FPR zM1`z)xS?K=;7%KytFj0YS7n_Izd8lC-vm=QTfjV7c$6GJ2A_GC-2Qd1>0R^JtMh0p`~FRgDe|~AmVWnlG4J2#EM9$G^>B)c zjF(>E5%s$Q&Ru%H(%d{5Ms4N_bliLE6TSw#zf!ud6T_l!iT7YgA}}GZsqPDZEd}6S zc1{4`j=M9e15dtw7h748Q`Yb9=2n$*3-0DNcYkB8*U{U|$bE{Sp414@UT$wrYhK>Qg*!-IS?-cy~ZcGT`AohJ;K^i*4_VWai9E7PgMKyAcB cIrDHY7j06{eb1eg`O4jlH*hQ7@HZ>}1NT4A`v3p{ literal 15515 zcmds8TWlQHc|NndTyl94FQ!DvlI1aDTa@i=OiHGkICXrHl%%#8Wu(+Gn|3j&W=l}leIXnLEQ{&gZ{{GuFW&V}TceG+D<>SAl>PoHad_mPM z)hMX-g0k3FRP~~2l+=1jmrJTXq8eqjUe@IiRUcK2F||IX%VkxssK&TjAJ^qkRi99e zNwq$y%VVlOr5eZ7`Y~OusQR>O%&7HQT^^V6oLYZGmnT$xUNw%Z_2arcsp=KcRx-Y7?_8sP8Jy@b(=`tv}AKy1sN0`xpK<{;e%x z166zs$u+OzH7?((1?@O&HFfYX5Jbvw1d2{waH(5wZzX%bCuhVKTi*4X{hYuQ9^ z1iQcN)w{tpFYF}sbLj0!Pq)qIxZOCcN7+pIF}ik&OKP?1*SZ_^Fxn0}y1ImF-;2#6 zMo^OZbmKURmo{z$QT)0WnJ#>_E8(rU+X_u;!#v>1R5zAQzT@l56vrV%i zJfn8Ax5f`^u}s+3ZyryhzYr(-1~-kbmoh>DZTyR-Ku6Gj-BJNCq|_hFGjjwsGmj9_%*+$i%p50*nK?oHGP7Xt3nuYTO3f+dpOOq1 z;!(+*R{m+poKgN6$vmc<>r0PeTO6YF;n3J2*#;7~Mi!z(;@|7+bsIJ0X>eZw+zf6k z;S0N6#uv7DOn+6>>b|9JgKL$-ko%U}FR0j3_mCFVPD$;INT#fIM%C>?l8&kSCH1X> z+Apg8k_@k?+eLLx2!u&Mo%;}doHuPKb9SuYK*OXoOdV`ECJoaE8}N8cg*1CcNgiI1 z2E0dqLrEGSmiiki(txzTVMZEerQz0d>UK$8`qd}Z{)oKogu0DPQQgE&&N06L94&B; zcdl7)`3mxF9#mMv9)i(Yt+;}3!<}(QYB#)2{2VFOY6R}hVAqYez1a1_X6y#H!YFpb zW+Dt)9al4M_$(Mr<}&4GEUdZdh4sL9Tki&)PUr_xXL>Xm-Pqfx>pH!HFs`GZrpvx38daxOUr2}zTAf<)w>3Z$Z?M4uICDb)rt&NBX6;WbG zk05J@k?q-f9$VySb%`7kA4lSD1+iO)gg3J_T7FQMg-A~=!DH?;J8p(euO7aSjgZ#J zq3RI9rl*g0+kxwE#H`jex?>OrohU~k_TgU0EV_~6+K6Pm4-wz#@;hCxF2uy+Wr!#B zH#*&5iSH?I9R>Bxm?ga`Sy1ks@G!DsfI?VxtE+TM*% zp@9-#cC3FRmeCkJ&#_j~8a1Es!gQf*Rq!cWbEQ)Se2VhN6rWL5wnVH@!SVe?tc+kC zF}T`NF=V_57cE=vr~-J>>S=?tf!rxW^Gh4RVI+?cImMjF0slhMh?v>(Sr?`tVc*;1Qvj)v;cv$FybI>fZW0eh$=J)f0Jly z8rEJTaERrYTlFsO4u{4@OdM+}HoJ`tfQ-^$x%#}Yv2y|ihf3W!&4l*Q7XI+>-@dd& zlfmJ10uIjyb9dZsn`Vc@S)3=B&~k7-!$hp4Cz*Q+NzBO%etK;MVB0yzZbXrDp2;&v zmiQ=#;>h_dlPZ(XF(GU+*f}dG#++a%*j)2K*@x&?&^0=XL|JF>DOv+zr-4Qu;hzBQ zUyvbS1Y(2r*FnX_0r*d)R(y~aD<*g~N4cPqT}FA;SUp zzYhmunHw+}88{po1k-S6m|0Q<)J1PGjWWRmd{|SdV46+@Q&B|GDEg-efvZJ?00m47 zk`^T`84(401v(mL4Vc>qj}f(B77dOjXz+|MD5F7_g&q{RYfHjw8JlsVmbi*+j}E94 zDDKUc)SA~72`;tHOBkxPv(e~ARhhc{fT*AA9_QF$BHj%e?RfWx=py!^f>2LBC#@OH zUp>3`J#@vskzFj9g7|`&sP~f9sMA}@0$XHf*{z7ekvBMdLLyLQpG`I9O~q*m>sf`|Es($ty_ucaU;u_zpH(&EQYaBO>Q%K#mutEPl$? zNo!%iCf-L!y<6NPtq5140%7H@LhnJ_t-?wbc_b(`o5?R&^fS@Y)#e%O~p3an)GV}q2XLclLiI}sS)8^ zLH0p-aK4OA5@vws5NsJIfmXUyZXog!c+CthOGJnB6()yD1ad+xSvYJ2#3_d zpe1)?(}F9@^oLpQAPWP}L|^?M-8M@)+=$3*-rC5klmXb$CdUP>S+r$AljAw9VEA=G zN*#RVqz7e&mL8NN;*ooujPn%ngzqFb1*y&}R}=Px*4C%);JwJ!=Y>ii4Bb7H8O@UPb1HacqKUWP1p z___16pX)zNL9Zu3?irdB`PWo~tF68B$NZ}baDdi6LtQETz1tg{G5^p_W{ zMbj>Ui3-Nk`W5N^PslugPcvxu+I+^o1H>}UG(CVfPHIYknPExr=oBy~XSejscP|_% z`ayo2#gPSKwr@2rs1m~1H^)`yXUf_iMT8Ulhy#s%gsWgJ;)Dm8QJw|eln|KJwA42R zLGyT56SaDcuT5$TdZI}d?K;jRY)Z#S3v#;P2VBH@tAo?bupM<9i7a2^JYocjIcT%U zaDbSDoxu0QSmILpT-dE`dpPN=N3WpEjcpt$MBA-y-M6W>!i0m!<78G&IB-COKyoA6>W_`kiyN-R5F62_ zQUQ*qaP-`+BM>d8R@o_)*{jF#u;@w5mNC?Lf$TDm=r2`U#hSFHo&t0j+2({zx(mh$3Okq2S51uC-~e!_S+xw>-^vUrEU7?xQCNsGUhCr7(!8{pm*^-u>Y250Lwb`MYCkzkT;ZWm zkb+T6C6D4n_@$h$ClEI&nvPj0T7!mW8NX z$)_gj&w*n4Xhx{S4Lb^_@=z!tS91KTPXPOg_X2tjXV}!%1R;CL8@)ohQf`B;&}{RC zGSZU;($)luxt|Oci#B8Yk0jB)3Uh{{2YeN_f%{HDrethZ(;wk5j)w8Yo_H8bxV*sNzw6ZmxtyB`{1Pt`J6C7r*p^nBykE@THkOOL4_l)@nMp6{a4GOQFnzyTM_TsD!4@ zN_9EsS(8w?fSafbQMRVxB7&}zuB=-&As6q3T;+-wZDEmpsJgw2qAN@U{sj>vT76{^ z86BXZMjGx)@%aPcJ~TG}87^Vy>4w0W%G4ovuc5D!Sllr=%+^u4iNdHg15H!JX994} z{~aq*^OUWp@yB)^f=h~i$BLs!(;GAu%q_tGD?AF~1ro^3bAZML=}86<{gYm(F~%9J zxJeLRoF#UgMgbkC1O+hECL|*U7?8PDd+sc>&eNEik1XzQCO%_Aq>b zi%BdQzAz=@%bA{77~yQ@!pd?bEP*B5YT_(h33#TU?g8mqk;)-PKhHqZmNJIn`(nL4 zyOeMYddeBaz+Gb{cTFTnvTMSFENG!oVYGrpY!t3sojJI7DI@U^^Z+9{P1IrvrL>Eq z{TVXW4M0zOG~^eSG;1VG!`M~>ElC-tBT1I=hgPoXMKnFbNpg1RMqo_Dz_(!ldbW;e z+M0Qz7tvj3ZH{^lCS~in#D+b5tY+KQP}p2p_(g}jnd4WnTWCgisY8ykEQzySU}pr} zKEaaMT?`U!rFyq6g`1lLqjNtO0f9@J@$XVVh`C&(y)p{hCAsl3Rlsc*uzJy&D$*nc z>*qeR)PmMCIRU|OQ?z@`m{de?@ggFAhzvPK>qet7GPP#-HudJnP6%tjN3;9GZkPpp zWx)$W^IOel;gFTYA^Q#-vJu>*8=?1g50M*v5v8nd;`Uuh(GjDK1WQS76ljBp%KHHL z4PF^U)Be4@#%`@1*6?&lbFoprf?Uo4A*`-=^(fFD$giQOoszKWi$9`078=z0=16)L zEAEC!^fqoqIgp_T&SQDE%0m~5! zx(6^6Xs=;|HA*VTUDDfM+ZCWVZ=-4uTAcSe3V+HWP@Fv`bXtdk#G&sn5F5O+_5f@& z!YHD7n}OqR2@Wxo2Y`dd?&2W8@a0p$?4ytYCLcYZoF+i1Iuu-WQhcZ=v*YxtTFWkIqALa(1!_31scqeS`c(@B&=dITN z;MOKSyxe3FUr#g{%^m_lG}*5slWpnYnhYukJIh_eI)HgG5_iB5a>WGj1{c5vWo)Lx zN$(d+S}k!))*_}bc2=smWDL~aLDAV^as`P*jt+~fVSf==t3D$)UUT<)vj~h_zv9KY z{B0@*<@CiYw&bqgrsE>HJR~knJjc;;mDlmYD2N=~PPo<9l5G)f!X(=J$u!@~Xpk69 z>c0;NvmGwhWHA|IxD5T_Mvv-Y!2vOUjH?g#8%`*mh0M9%V=6$7&o0 z!HWRBK&<435|1qCuWBjBqaSvG4}&iKjFbvGFpIvFEBER+bC-rjaAiosRHDYK@w-RdN@%!*t5IbNn`zqS`|i+U1cL@r6!TlE@h zF+unjp#4Bbzw$$kdMO5x^BE6K)?`H!JjZSu?gE0N-SemxwuVc z1&@jj1JUjm3z|W-z+-6pRk_4v)9;4ovS}}ZS*w04i1@Q4nAwZA6q0zjzWlB)exZBB zv)#TCvZ0!1ehaNKLVlxlnIUP1)RU|Ayp3f7oJ)KgO_$$BZV7)n(btfvB4w+yA>bYJ z3o$>5p6NyF=rw;nA!e|`&KL^E!Fok0@BhNl{(H9f$WAa52}*2}N0x^M}ZZw!?NiLL}0r-^%-d{r`x`?=vB} z`ba1jl$S{qUKiq})k$kkKGW7hVTp%D62NxdChpj~t}NPh@iUMv3h6Ceuv5LG5G@~Paw(OP;!D)xt&itI9f$gF3|0qEmWSVJX$$h8Lv!LW-4=) zS){X-Co0D)lPJAZ`8>WCD$|t-w4bh&muw6bFf>{K14H+SQPf(EMypv3lAlaQRgp@f zsbX$l)<=Fj6IJ!?{Hh)(#2wtv->7C(UbSL;AM-0~=q0t#*vdC`CVOf+H zkyBv}55JR|YVu>qy8JxTp^YNHyhzaHUVHWRH$*<&xP1MFd-ZFVF28wQ${ayN;`Gt^ zQx4*xc>L zGB8V!oC2juF_BWyrJ_M-8yW-+N)aInB&tY&K#(R;A|jwbf;VRuK|Ax_eEYul^v%4P z>+L&Bmj1_3^wy1!KDW;6i6{W?>ZPTf%dcPc+u=LkEX&V~$&?OZ zVxQ2}a5;khhw=xbDxVl<=t20hd5cT4Ra z%)|LAdv96B?H8JU1S0ZG`8OeSbafQBjKe@+U>gty+7l6Z#&qlFhBB_KtT29f5G%Clk1?z0D zVDab-*e4-Q$Zv;hqn_2ZA#x0{Re>m|{T45l(eo@G9Wf`v;@ER@5Oah0)Iq$8UTAeT zfM6PXSKz1NXCRKte~M-9(@3dyZQd3xg7V;eTy#wo0vElq-4WB+%0rY@A?p2YbyVhw z!7-Z{3FfiafAqMx#kE8X-4srV#evS)fzF5W zu{*i&|6jZpJ~|fEgjj%ZAXxS>aH6PV!$Hu3XrbLr%d^!SW#oGG$Lyf*Oa1ris~fAE z+s$Tkq7kmvCMmpG|3W)rbK}?E-tpGAy|%BwTbq0Q1`fgIwx@u6w~>zzm^)Y2U-Q@d z@_J)Ne$!YsOT_nPHyj@~>4Ij_xTfxSl5Eprr0%_|D<7wlW>S$%{-T<~4kaRKJH_w8 z(sGoDB{`nZDzU6?>LzDInRhr3R&w{qZ}d~Ra`aCvS$9&-th4AGcjC^!xGOJBj{OH6 C-^#fF delta 985 zcmZ8g&2Jl35dY0vdq0ewwc~s_{z#mru1ghHkfupRd!ZJMR8ysPq;QEWCu>5S)=Ru= z+LY&0_y^!2ae@Ql&c_}(^n#Fj;lc%R>8%Kr8v=;~D)XYWs*vW5W@mo$d-G;yzuNq$ zWf^~_5@!0rx7IsG$^j4zcQ*Zlw})YL*LX-&QcLj$1~;^)=VctIu12K^ju znV%BPt3RxKp+s3KQpwmA%we9M>zc0)RpYE%w%L#dJb_#<1{uRKVHAgqqg6E+cPnsN zf8g(Sc7}I4gQHq6@cYdv_EqDon$ud%XqD4yRz0*o8{c6wNU(x%X)@--vQf|ZJWhv^ z?Y=4K%jjn25t+YgR7GuMW}{2lABd9bpNR?`srkv<<)IT=x*C38&Wj`WqACwK5EyvT zCzB6MJ6wQFLZ;O1LQbs~($rGxg^M>+*2ZDVV%d@wN~0BoMaboor_DmLETdh5=U|iv zvyY0nzXXQXx6fi!f@E1fx#kN?Z4@WGVU!yobBvs3$jntn$XDQ{A=fZ{Rj#5p zsU1v9hnu!aPgNWL^KD6f8rNKdybS3;mLV^KGvz$?xN%n?ub|~+abullbYq>H+2SVf zcv{s7m7058Yz}z7&22s8B&*HA(R^pGv)`}PYSqQ)+1z;&%?r`l^7rCen&bX3Y={0q zw;#0c_`B^O)aw;=`(BGT0od;cy#K9mjO~8+-g7Ab7OJwiRMJc8_q*$DcC>?g`{C|; z+(jVtH#$L}KDO!^&GLSC@UB0&J3~zEMc*x&)G*3ooXX^qZCWBpjxfoj6tP8Ph81(! z;$x') + # A Place can access its restaurant, if available. + self.assertEqual(repr(self.p1.restaurant), '') + # p2 doesn't have an associated restaurant. + with self.assertRaisesMessage(Restaurant.DoesNotExist, 'Place has no restaurant'): + self.p2.restaurant + + def test_setter(self): + # Set the place using assignment notation. Because place is the primary + # key on Restaurant, the save will create a new restaurant + self.r.place = self.p2 + self.r.save() + self.assertEqual(repr(self.p2.restaurant), '') + self.assertEqual(repr(self.r.place), '') + self.assertEqual(self.p2.pk, self.r.pk) + # Set the place back again, using assignment in the reverse direction. + self.p1.restaurant = self.r + self.assertEqual(repr(self.p1.restaurant), '') + r = Restaurant.objects.get(pk=self.p1.id) + self.assertEqual(repr(r.place), '') + + def test_manager_all(self): + # Restaurant.objects.all() just returns the Restaurants, not the Places. + self.assertQuerysetEqual(Restaurant.objects.all(), [ + '', + ]) + # Place.objects.all() returns all Places, regardless of whether they + # have Restaurants. + self.assertQuerysetEqual(Place.objects.order_by('name'), [ + '', + '', + ]) + + def test_manager_get(self): + def assert_get_restaurant(**params): + self.assertEqual(repr(Restaurant.objects.get(**params)), + '') + assert_get_restaurant(place__id__exact=self.p1.pk) + assert_get_restaurant(place__id=self.p1.pk) + assert_get_restaurant(place__exact=self.p1.pk) + assert_get_restaurant(place__exact=self.p1) + assert_get_restaurant(place=self.p1.pk) + assert_get_restaurant(place=self.p1) + assert_get_restaurant(pk=self.p1.pk) + assert_get_restaurant(place__pk__exact=self.p1.pk) + assert_get_restaurant(place__pk=self.p1.pk) + assert_get_restaurant(place__name__startswith="Demon") + + def assert_get_place(**params): + self.assertEqual(repr(Place.objects.get(**params)), + '') + assert_get_place(restaurant__place__exact=self.p1.pk) + assert_get_place(restaurant__place__exact=self.p1) + assert_get_place(restaurant__place__pk=self.p1.pk) + assert_get_place(restaurant__exact=self.p1.pk) + assert_get_place(restaurant__exact=self.r) + assert_get_place(restaurant__pk=self.p1.pk) + assert_get_place(restaurant=self.p1.pk) + assert_get_place(restaurant=self.r) + assert_get_place(id__exact=self.p1.pk) + assert_get_place(pk=self.p1.pk) + + def test_foreign_key(self): + # Add a Waiter to the Restaurant. + w = self.r.waiter_set.create(name='Joe') + w.save() + self.assertEqual(repr(w), '') + # Query the waiters + def assert_filter_waiters(**params): + self.assertQuerysetEqual(Waiter.objects.filter(**params), [ + '' + ]) + assert_filter_waiters(restaurant__place__exact=self.p1.pk) + assert_filter_waiters(restaurant__place__exact=self.p1) + assert_filter_waiters(restaurant__place__pk=self.p1.pk) + assert_filter_waiters(restaurant__exact=self.p1.pk) + assert_filter_waiters(restaurant__exact=self.p1) + assert_filter_waiters(restaurant__pk=self.p1.pk) + assert_filter_waiters(restaurant=self.p1.pk) + assert_filter_waiters(restaurant=self.r) + assert_filter_waiters(id__exact=self.p1.pk) + assert_filter_waiters(pk=self.p1.pk) + # Delete the restaurant; the waiter should also be removed + r = Restaurant.objects.get(pk=self.p1.pk) + r.delete() + self.assertEqual(Waiter.objects.count(), 0) + + def test_multiple_o2o(self): + # One-to-one fields still work if you create your own primary key + o1 = ManualPrimaryKey(primary_key="abc123", name="primary") + o1.save() + o2 = RelatedModel(link=o1, name="secondary") + o2.save() + + # You can have multiple one-to-one fields on a model, too. + x1 = MultiModel(link1=self.p1, link2=o1, name="x1") + x1.save() + self.assertEqual(repr(o1.multimodel), '') + # This will fail because each one-to-one field must be unique (and + # link2=o1 was used for x1, above). + mm = MultiModel(link1=self.p2, link2=o1, name="x1") + with self.assertRaises(IntegrityError): + with transaction.atomic()-= + mm.save()