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.