Sorry that I missed some important message. The order if save and load are not inversed. What I want to do is to load the data stored in the first run when running the second time of my program. The intention is I guessed (may not be true) some implicit initial states of each run affect the result, and I also want to detect the problem caused by the initial states.
John H Palmieri 在 2023年1月5日 星期四凌晨2:53:37 [UTC+8] 的信中寫道: > Your current code has fragments like this: > > weighted_load = load_obj(f'./sym.sobj') > print(f'weighted == weighted_load {weighted == weighted_load}') > save(weighted, f'./sym.sobj') > > In particular, "sym.sobj" is read before it is written, so 'weighted_load' > will be None. If I put the "save" lines earlier, I see this: > > weighted == weighted_load True > realm == realm_load: True > realm != realm_load: False > determinant > -7.116356115499656e-14 > -7.116356115499656e-14 > -7.116356115499656e-14 > > Having said all of that, I think that determinants tend to be numerically > unstable, and it would not be surprising for a number so close to zero to > display that instability. A small change in one of the entries of the > matrix, due to how the decimals are represented, could easily change the > determinant. > > On Wednesday, January 4, 2023 at 9:12:55 AM UTC-8 ivana...@gmail.com > wrote: > >> I found I got different determinant value every time I ran my program. I >> tried to save the current matrix and load the matrix in the next run, and I >> compared two matrices. The compare results are not stable either. Sometime >> they are the same and not the same at the same time (A == B is False and A >> != B is False either)! >> >> Here is the minimal case I could figure out. I tried to replace the >> testing matrix to a simpler one, but the issue could not be reproduced >> after replacing. I am sorry about giving you some many lines of code. I >> guess it's not easy to read code on Google Groups, so the file is attached. >> >> from functools import cache >> >> from sage.all_cmdline import * >> >> >> l = 1 >> >> >> def load_obj(filename): >> try: >> return load(filename) >> except FileNotFoundError: >> return None >> >> >> @cache >> def expected_distance(n, l): >> if n <= -2: >> return 0 >> if n == -1: >> return -2 * x >> if n == 0: >> return 1 >> return (( >> - 4 * (2 * (n + 1) - 1) * expected_distance(n - 1, l) \ >> - n * ((n + 1) * (n - 1) - 4 * l * (l + 1)) * expected_distance(n >> - 2, l) >> ) / (8 * (n + 1) * x)).full_simplify() >> >> # Generate the matrix for testing. I tried to figure out a minimal >> reproducible >> # code, but I failed. >> depth = 8 >> functions = [expected_distance(i, l) for i in range(depth * 2 - 1)] >> hankel = matrix.hankel(functions[:depth], functions[depth:depth * 2 - 1], >> SR) >> weighted = matrix(depth, depth, [(hankel[i][j] / hankel[0][j] / hankel[i >> ][0]) >> for i in range(depth) >> for j in range(depth)]) >> >> # Only with this useless line, you can see the first and the second cases >> # listed in the comment (*) below. >> weighted = weighted.submatrix(0, 0, depth, depth) >> >> weighted_load = load_obj(f'./sym.sobj') >> print(f'weighted == weighted_load {weighted == weighted_load}') >> save(weighted, f'./sym.sobj') >> >> realm = weighted.substitute({x: -0.0070218}) >> realm2 = weighted.substitute({x: -0.0070218}) >> realm_load = load_obj(f'./real.sobj') >> save(realm, f'./real.sobj') >> >> # (*) There are three possible output of this two lines >> # 1. >> # realm == realm_load: False >> # realm != realm_load: False >> # 2. >> # realm == realm_load: True >> # realm != realm_load: False >> # 3. >> # realm == realm_load: False >> # realm != realm_load: True >> # >> # The possibilities of each case are almost the same. >> print(f'realm == realm_load: {realm == realm_load}') >> print(f'realm != realm_load: {realm != realm_load}') >> >> # The determinant values are different in defferent runs >> print('determinant') >> print(realm.det()) >> print(realm2.det()) >> print(realm_load.det()) >> >> # Only print something when the third case happened. >> for i in range(realm.nrows()): >> for j in range(realm.ncols()): >> if realm[i][j] != realm_load[i][j]: >> print(f'{(i, j)}') >> print(realm[i][j]) >> print(realm_load[i][j]) >> >> -- You received this message because you are subscribed to the Google Groups "sage-devel" group. To unsubscribe from this group and stop receiving emails from it, send an email to sage-devel+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/sage-devel/52848b5f-a881-4aaa-b603-2fe43224bb29n%40googlegroups.com.