in nevergrad/functions/photonics/photonics.py [0:0]
def morpho(X: np.ndarray) -> float:
lam = 449.5897
pol = 1.0
d = 600.521475
nmod = 25
# nmod=1
e2 = 2.4336
n = 2 * nmod + 1
n_motifs = int(X.size / 4)
X = X / d
h = X[0:n_motifs]
x0 = X[n_motifs : 2 * n_motifs]
a = X[2 * n_motifs : 3 * n_motifs]
spacers = X[3 * n_motifs : 4 * n_motifs]
l = lam / d # noqa
k0 = 2 * np.pi / l
P, V = homogene(k0, 0, pol, 1, n)
S = np.block([[np.zeros([n, n]), np.eye(n, dtype=np.complex_)], [np.eye(n), np.zeros([n, n])]])
for j in range(0, n_motifs):
Pc, Vc = creneau(k0, 0, pol, e2, 1, a[j], n, x0[j])
S = cascade(S, interface(P, Pc))
S = c_bas(S, Vc, h[j])
S = cascade(S, interface(Pc, P))
S = c_bas(S, V, spacers[j])
Pc, Vc = homogene(k0, 0, pol, e2, n)
S = cascade(S, interface(P, Pc))
R = np.zeros(3, dtype=np.float_)
for j in range(-1, 2):
R[j] = abs(S[j + nmod, nmod]) ** 2 * np.real(V[j + nmod]) / k0
cost: float = 1 - (R[-1] + R[1]) / 2 + R[0] / 2
lams = (np.array([400, 500, 600, 700, 800]) + 0.24587) / d
bar = 0
for lo in lams:
k0 = 2 * np.pi / lo
P, V = homogene(k0, 0, pol, 1, n)
S = np.block(
[
[np.zeros([n, n], dtype=np.complex_), np.eye(n)],
[np.eye(n), np.zeros([n, n])],
]
)
for j in range(0, n_motifs):
Pc, Vc = creneau(k0, 0, pol, e2, 1, a[j], n, x0[j])
S = cascade(S, interface(P, Pc))
S = c_bas(S, Vc, h[j])
S = cascade(S, interface(Pc, P))
S = c_bas(S, V, spacers[j])
Pc, Vc = homogene(k0, 0, pol, e2, n)
S = cascade(S, interface(P, Pc))
bar += abs(S[nmod, nmod]) ** 2 * np.real(V[nmod]) / k0
cost += bar / lams.size
return cost