Если вы собираетесь писать это для мира ab-initio (который я предполагаю из вашего уравнения MP2), вы хотите, чтобы было очень легко и ясно выразить вещи как можно ближе к математическому определению, которое вы можете.
Во-первых, у меня не было бы сложной функции range
.Пусть он определяет цикл, но если вы хотите использовать вложенные циклы, укажите их оба:
Поэтому вместо
(range(i) < j < N)[T(i,j) = (T(i,j) - T(j,i))/e(i+j)];
используйте
loop(j,0,N)[loop(i,0,j)[T(i,j) = (T(i,j) - T(j,i))/e(i+j)]]
И для таких вещей, как сумма и произведение, сделайте синтаксис «наследуемым» от факта, что это цикл.
Так что вместо
sum(range(i) < j < N))[(T(i,j) - T(j,i))/e(i+j)];
используйте
sum(j,0,n)[loop(i,0,j)[(T(i,j) - T(j,i))/e(i+j)]]
или если вам нужна двойная сумма
sum(j,0,n)[sum(i,0,j)[(T(i,j) - T(j,i))/e(i+j)]]
Поскольку, похоже, вы пытаетесьпредставьте квантово-механические операторы, затем постарайтесь, чтобы ваши языковые конструкции соответствовали оператору на основе 1-1, насколько это возможно.Таким образом, его легко перевести (и понять, что переводится).
EDITED TO ADD
, так как вы занимаетесь квантовой химией, тогда это довольно просто (по крайней мере, в синтаксисе).Вы определяете операторы, которые всегда работают над тем, что справа от них, и тогда единственное, что вам нужно, это скобки для группировки, где оператор останавливается.
Обозначение Эйнштейна забавно, когда вы не указываете индексы или границы, и они подразумеваются из-за соглашения, однако это не дает четкого кода и сложнее думать.
Для сумм, даже если подразумеваются границы, их всегда легко определить на основе контекста, поэтому вы всегда должны заставлять людей указывать их.
sum (i, 0, n) sum (j, 0, i) сумма (a, -j, j) сумма (b, -i, i) ....
Поскольку каждый оператор работает вправо, его переменные известны, поэтому j может знать о i, a может знать о i и j, а b может знать о i, j и a.
Из моего опыта работы с квантовыми химиками (я тоже один!) Им не нравится сложный синтаксис, который сильно отличается от того, что они пишут.Они с радостью разделяют двойные и тройные суммы и интегралы в набор синглов, потому что в любом случае это просто условные обозначения.
Симметрия тоже не будет такой сложной.Это просто набор свопов и добавляет или умножает.Я бы сделал что-то, где вы указываете операцию, которая содержит список элементов, которые являются одинаковыми и могут быть заменены:
c2v (sigma_x, a, b) a + b
Thisговорит, что a и b могут рассматриваться как идентичные частицы при операции c2v.Это означает, что любое уравнение с a и b (например, a + b после него) должно быть преобразовано в линейную комбинацию преобразований c2v.sigma_x - это операция в c2v, которую вы хотите применить к своей функции (a + b).Если я правильно помню, это 1 / sqrt (2) ((a + b) + (b + a)).Но у меня здесь нет моей книги симметрии, так что это может быть неправильно.