Experimental autodiff support through JAX

This uses JAX despite #714 because it has good documentation.
Obstacle problem with penalty?
from skfem import *
from skfem.autodiff import NonlinearForm
from skfem.autodiff.helpers import *
import jax.numpy as np

m = MeshTri().refined(5)
basis = Basis(m, ElementTriP1())

eps = 1e-3
f0 = -1.

def g(x):
    return np.sin(np.pi * x[0]) - 1.05

@NonlinearForm
def F(u, v, w):
    return (dot(grad(u), grad(v))
            + 1. / w.h ** 2 * (u[0] - g(w.x)) * (u[0] - g(w.x) <= 0) * v[0]
            - f0 * v[0])

x = basis.zeros()
D = basis.get_dofs()

for itr in range(50):

    DF, y = F.linearize(basis.interpolate(x))

    J = DF.assemble(basis)
    f = y.assemble(basis)

    xprev = x.copy()
    x += 0.99 * solve(*condense(J, -f, D=D))

    res = np.linalg.norm(x - xprev)
    print(res)
    if res < 1e-8:
        break

basis.plot(x, shading='gouraud', colorbar=True).show()

Unfortunately this is a bit backwards in the light of #849 because JAX doesn't really support subclassing its own ndarray whereas tuples work just fine. This is still heavily WIP.

@NonlinearFunctional
def G(u, w):
    return .5 * dot(grad(u), grad(u)) - f0 * u[0]

x = basis.zeros()
D = basis.get_dofs()

for itr in range(50):

    J, f = G.assemble(x, basis)

    xprev = x.copy()
    x += solve(*condense(J, f, D=D))

    res = np.linalg.norm(x - xprev)
    print(res)
    if res < 1e-8:
        break

basis.plot(x, shading='gouraud', colorbar=True).show()

I believe this is some sort of prototype nonlinear elasticity:
from skfem import *
from skfem.autodiff import NonlinearFunctional
from skfem.autodiff.helpers import *
import jax.numpy as np

m = MeshTri().init_tensor(
    np.linspace(0, 4, 30),
    np.linspace(0, 0.1, 5),
)
basis = Basis(m, ElementVector(ElementTriP1()))

@NonlinearFunctional
def G(u, w):
    du = grad(u)
    duT = transpose(du)
    eps = .5 * (du + duT) + mul(duT, du)
    sig = eps + eye(trace(eps), 2)
    return .5 * ddot(sig, eps)

x = basis.project(lambda x: np.array([-x[0] / 25., x[1] * 0.]))
D = basis.get_dofs(lambda x: np.isclose(x[0], 0) + np.isclose(x[0], 4))

for itr in range(50):

    J, f = G.assemble(x, basis)

    xprev = x.copy()
    x += 0.95 * solve(*condense(J, f, D=D))

    res = np.linalg.norm(x - xprev)
    print(res)
    if res < 1e-8:
        break

mdefo = m.translated(x[basis.nodal_dofs])
m.draw().show()
mdefo.draw().show()

  I believe this is some sort of prototype nonlinear elasticity:
from skfem import *
from skfem.autodiff import NonlinearFunctional
from skfem.autodiff.helpers import *
import jax.numpy as np

m = MeshTri().init_tensor(
    np.linspace(0, 4, 30),
    np.linspace(0, 0.1, 5),
)
basis = Basis(m, ElementVector(ElementTriP1()))

@NonlinearFunctional
def G(u, w):
    du = grad(u)
    duT = transpose(du)
    eps = .5 * (du + duT) + mul(duT, du)
    sig = eps + eye(trace(eps), 2)
    return .5 * ddot(sig, eps)

x = basis.project(lambda x: np.array([-x[0] / 25., x[1] * 0.]))
D = basis.get_dofs(lambda x: np.isclose(x[0], 0) + np.isclose(x[0], 4))

for itr in range(50):

    J, f = G.assemble(x, basis)

    xprev = x.copy()
    x += 0.95 * solve(*condense(J, f, D=D))

    res = np.linalg.norm(x - xprev)
    print(res)
    if res < 1e-8:
        break

mdefo = m.translated(x[basis.nodal_dofs])
m.draw().show()
mdefo.draw().show()

Awesome! This works perfectly, but if I try to invoke jit explicitly it ends up taking humongous time for me, i.e.
@BilinearForm
        def DF(u, v, w):
            F1 = lambda U: self.form(U, v, w)
            return jvp(F1, (u0.astuple,), (u.astuple,))[1]
"""
instead of
@BilinearForm
        def DF(u, v, w):
            F1 = lambda U: self.form(U, v, w)
            return return jvp(jit(F1), (u0.astuple,), (u.astuple,))[1]
"""
and so on... (will have to check up on `jax.jvp` in more detail)

I didn't yet try any optimizations, e.g., using jit. I'm not even sure how well this combines with JAX automatic differentiation functionality. The background of JAX seems to be that the autodiff functionality comes from Autograd (another older package) and then on top of it is the functionality to jit the code, but I think just-in-time compilation might only be related to running the code on GPU/TPU:

With its updated version of Autograd, JAX can automatically differentiate native Python and NumPy code. ... What’s new is that JAX uses XLA to compile and run your NumPy code on accelerators, like GPUs and TPUs. Compilation happens under the hood by default, with library calls getting just-in-time compiled and executed.

So I'm not sure if this JIT actually is relevant here as we are not attempting to do any GPU/TPU stuff here.

It seems that one should be able to install JAX with only autodiff/CPU functionality via pip install jax[cpu] and it should be pure Python. I'm trying out if that works in the test suite.

I suppose there is now everything that I'd like this kind of functionality to have. It's marked experimental and probably it can be improved performance wise a lot if someone actually understands how this stuff works (I don't). However, for the basic cases that I need it for it seems to be working pretty nicely.
I tried using this idea of doing forward AD over reverse AD by combining jax.jvp and jax.vjp but I couldn't make it to work. Apparently it should make it more effective. There should also be some sort of caching happening because these derivatives now get evaluated multiple times inside the forms for the same values.

@adtzlr You seem to be well versed in AD. Do you have any comments on this PR? Am I doing something which doesn't make sense?

I guess casADi is about differentiating through expressions defined using it's own syntax and not really arbitrary Python code. There could definitely be different ways of defining the forms supported by scikit-fem, e.g., symbolic stuff using sympy.

So I'm not sure if this JIT part is actually relevant here as we are not attempting to do any GPU/TPU stuff. I think the GPU/TPU stuff might be more relevant for applications with dense N-arrays such as deep learning.

Cool, I just wanted to test something like ex43 or the one from #439 using this functionality -- hence thought of naively jitting the function, but that doesn't work. In its current state this takes a lot of time, maybe the problem is somewhere else since even without jitting it just stalls...
@NonlinearFunctional
def G(u, w):
    du = grad(u)
    F = identity(du) + du
    J = det(F)
    logJ = np.log(J)
    I1 = trace(F)
    W = mu/2. * (I1 - 3.) - mu * logJ + lmbda/2. * (J - 1.)**2
    return W#.5 * ddot(sig, eps)

where the identity helper is the same as before except now with jax.numpy
def identity(w, N=None):
    """Create identity matrix."""
    if N is None:
        if len(w.shape) > 2:
            N = w.shape[-3]
        else:
            raise ValueError("Cannot deduce the size of the identity matrix. "
                             "Give an explicit keyword argument N.")
    return eye(jnp.ones(w.shape[-2:]), N)

@adtzlr You seem to be well versed in AD. Do you have any comments on this PR? Am I doing something which doesn't make sense? Would it be better to use, e.g., casADi?

Hi @kinnala!
I think basically it doesn't matter which package you use. JAX is probably the best option if you're able to install ist but as I'm 99% on Windows I haven't worked with it yet. Personally I really like the older package Autograd because it is a minimal-dependancy package and can be installed everywhere - just like scikit-fem.
I only tried to implement the AD stuff for the constitutive part (material formulation in mechanics: strain energy function -> stress tensor -> elasticity tensor) and not on the full form like you did if I understand it correctly. But I like the idea, if AD, then consequently on the full form.
Recently I documented how to use Autograd on input data with trailing axes, if that is interesting for you (as a concept, without using my package matadi at all): https://github.com/adtzlr/matadi/discussions/11#discussioncomment-2554834
The two ML packages PyTorch and Tensorflow also have AD capabilities built in. A few comments above of the provided link there is also an example with PyTorch. A code using Tensorflow is also very similar. But for your idea; extending an existing code-base with NumPy it is easier to use Autograd or JAX. casADi is also fine but it behaves more like the sparse-package from scipy: only matrices with two dimensions are allowed. To sum up: I'd keep JAX if you've got it to work.

I guess casADi is about differentiating through expressions defined using it's own syntax and not really arbitrary Python code. There could definitely be different ways of defining the forms supported by scikit-fem, e.g., symbolic stuff using sympy.

Symbolic derivatives are super slow. I tried to create some simple derivatives, see e.g. https://adtzlr.github.io/blog/markdown/2021/10/12/SympyTensor.html - that worked really well but everything more complicated is a mess. Please correct me if I'm wrong. Also you have to find an efficient way to somehow broadcast the derivatives over the trailing axes of the input data.

Can you try installing jax[cpu] on Windows? They claim it's pure Python.

I tried it but it doesn't work, at least with the latest/stable release (which I think is jax-0.3.5).. here is a truncated output
Collecting scipy>=1.2.1
  Downloading scipy-1.8.0-cp39-cp39-win_amd64.whl (36.9 MB)
     |████████████████████████████████| 36.9 MB 6.4 MB/s
Collecting typing_extensions
  Downloading typing_extensions-4.1.1-py3-none-any.whl (26 kB)
Collecting jax[cpu]
  Using cached jax-0.3.5-py3-none-any.whl
  Downloading jax-0.3.4.tar.gz (924 kB)
     |████████████████████████████████| 924 kB 6.4 MB/s
  Downloading jax-0.3.3.tar.gz (924 kB)
     |████████████████████████████████| 924 kB ...
  Downloading jax-0.3.2.tar.gz (926 kB)
     |████████████████████████████████| 926 kB ...
  Downloading jax-0.3.1.tar.gz (912 kB)
     |████████████████████████████████| 912 kB 6.8 MB/s
  Downloading jax-0.3.0.tar.gz (896 kB)
     |████████████████████████████████| 896 kB 6.4 MB/s
  Downloading jax-0.2.28.tar.gz (887 kB)
     |████████████████████████████████| 887 kB ...
  Downloading jax-0.2.27.tar.gz (873 kB)
     |████████████████████████████████| 873 kB ...
  Using cached jax-0.2.26-py3-none-any.whl
  Downloading jax-0.2.25.tar.gz (786 kB)
     |████████████████████████████████| 786 kB ...
  Downloading jax-0.2.24.tar.gz (786 kB)
     |████████████████████████████████| 786 kB 6.8 MB/s
  Downloading jax-0.2.22.tar.gz (776 kB)
     |████████████████████████████████| 776 kB 6.4 MB/s
  Downloading jax-0.2.21.tar.gz (756 kB)
     |████████████████████████████████| 756 kB 6.8 MB/s
  Downloading jax-0.2.20.tar.gz (745 kB)
     |████████████████████████████████| 745 kB 6.8 MB/s
  Downloading jax-0.2.19.tar.gz (728 kB)
     |████████████████████████████████| 728 kB ...
  Downloading jax-0.2.18.tar.gz (708 kB)
     |████████████████████████████████| 708 kB ...
  Downloading jax-0.2.17.tar.gz (693 kB)
     |████████████████████████████████| 693 kB ...
  Downloading jax-0.2.16.tar.gz (680 kB)
     |████████████████████████████████| 680 kB ...
  Downloading jax-0.2.15.tar.gz (681 kB)
     |████████████████████████████████| 681 kB 6.4 MB/s
  Downloading jax-0.2.14.tar.gz (669 kB)
     |████████████████████████████████| 669 kB 6.4 MB/s
  Downloading jax-0.2.13.tar.gz (630 kB)
     |████████████████████████████████| 630 kB ...
  Using cached jax-0.2.12-py3-none-any.whl
  Downloading jax-0.2.11.tar.gz (596 kB)
     |████████████████████████████████| 596 kB ...
  Downloading jax-0.2.10.tar.gz (589 kB)
     |████████████████████████████████| 589 kB 6.4 MB/s
WARNING: jax 0.2.10 does not provide the extra 'cpu'
Requirement already satisfied: six in c:\miniconda3\lib\site-packages (from absl-py->jax[cpu]) (1.16.0)
Building wheels for collected packages: jax
  Building wheel for jax (setup.py) ... done
  Created wheel for jax: filename=jax-0.2.10-py3-none-any.whl size=679775 sha256=8cb6dc8392f124e771bf25e6dafff38cefed5fe9bffbbd179be36518f1af8555
  Stored in directory: c:\users\bshri\appdata\local\pip\cache\wheels\0b\36\5e\c025acb1b9e65160c25f33c9370675402c8e23ed6f613401ea
Successfully built jax
Installing collected packages: numpy, opt-einsum, absl-py, jax
Successfully installed absl-py-1.0.0 jax-0.2.10 numpy-1.22.3 opt-einsum-3.3.0

The alternative that worked for me on windows was to use the pre-built wheels (https://github.com/kinnala/scikit-fem/discussions/714#discussioncomment-2548254)

It seems that one should be able to install JAX with only autodiff/CPU functionality via pip install jax[cpu] and it should be pure Python. I'm trying out if that works in the test suite. I also tried looking a way to combine Numba and JAX but couldn't find anything so far.

No, there are no official binary wheels for Windows on PyPI:

We support installing or building jaxlib on Linux (Ubuntu 16.04 or later) and macOS (10.12 or later) platforms. Windows users can use JAX on CPU and GPU via the Windows Subsystem for Linux. There is some initial native Windows support, but since it is still somewhat immature, there are no binary releases and it must be built from source.

I think JAX is not meant to be used with Numba, they use XLA for compilation instead.

I adopted Example 43 and added a template code with the autograd-package. However, I didn't figure out how to use jacobian-vector or vector-jacobian producs directly. Hence, I had to create the full jacobians and do the matrix-vector-products by hand inside the forms.

Well, it is slow but it works. 🚀
r"""Hyperelasticity.

The strain energy density function per unit undeformed volume of the
isotropic hyperelastic Neo-Hookean material formulation is given as

..  math::

    \psi(\boldsymbol{F}) = \frac{\mu}{2} ( I_1 - 3) - \mu \ln(J) +
    \frac{\lambda}{2} \ln^2(J)

by the first invariant of the right Cauchy-Green deformation tensor
and the determinant of the deformation gradient (volume change).

..  math::

    I_1 &= \text{tr}(\boldsymbol{F}^T \boldsymbol{F}) =
    \boldsymbol{F} : \boldsymbol{F}

    J &= \det(\boldsymbol{F})

"""
import numpy as np

from skfem import *
from skfem.helpers import grad
from autograd import numpy as np, jacobian as jac

# helpers
transpose = lambda T: np.einsum("ij...->ji...", T)
ddot = lambda u, v: np.einsum("ij...,ij...->...", u, v)
mul = lambda u, v: np.einsum("ij...,jk...->ik...", u, v)
det = lambda T: np.linalg.det(T.T).T

def eye(w, size):
    return np.array([[w if i == j else 0. * w for i in range(size)]
                      for j in range(size)])

def identity(w, N=None):
    """Create identity matrix."""
    if N is None:
        if len(w.shape) > 2:
            N = w.shape[-3]
        else:
            raise ValueError("Cannot deduce the size of the identity matrix. "
                             "Give an explicit keyword argument N.")
    return eye(np.ones(w.shape[-2:]), N)

# jacobian function
def reduce(fun, argnum=0):
    "Function decorator for jacobians on inputs with trailing axes."

    def inner(*args, **kwargs):
        "Sum the result over the trailing axes."
        axes = tuple(-np.arange(1, len(args[argnum].shape) - 1))

        return np.sum(fun(*args, **kwargs), axes)

    return inner

def jacobian(fun, argnum=0):
    "Apply `jacobian` from autograd on a `reduce`-decorated function."
    return jac(reduce(fun, argnum=argnum), argnum=argnum)

# note: rough mesh to make tests fast
mesh = MeshHex.init_tensor(
    np.linspace(0, 1, 10),
    np.linspace(-.1, .1, 3),
    np.linspace(-.1, .1, 3),
).with_boundaries({
    'left': lambda x: x[0] == 0.,
    'right': lambda x: x[0] == 1.,
})
element = ElementVector(ElementHex1())
basis = Basis(mesh, element, intorder=1)

def deformation_gradient(w):
    dudX = grad(w["displacement"])
    F = dudX + identity(dudX)
    return F

def W(F, mu=1.0, lmbda=2.0):
    r"""The strain energy density function per unit undeformed volume of the
    isotropic hyperelastic Neo-Hookean material formulation is given as

    ..  math::

        \psi(\boldsymbol{F}) = \frac{\mu}{2} ( I_1 - 3) - \mu \ln(J) +
        \frac{\lambda}{2} \ln^2(J)

    """

    I1 = ddot(F, F)
    J = det(F)
    lnJ = np.log(J)

    return mu / 2 * (I1 - 3) - mu * lnJ + lmbda * lnJ ** 2 / 2

@LinearForm
def L(v, w):
    F = deformation_gradient(w)
    dF = grad(v)
    return ddot(jacobian(W)(F), dF)

@BilinearForm
def a(u, v, w):
    F = deformation_gradient(w)
    DF = grad(u)
    dF = grad(v)
    return ddot(dF, ddot(jacobian(jacobian(W))(F), DF))

u  = basis.zeros()
du = basis.zeros()
uv = basis.interpolate(u)

dofs = basis.get_dofs('right')
dirichlet = basis.get_dofs({'right', 'left'})

f = L.assemble(basis, displacement=uv)
K = a.assemble(basis, displacement=uv)

right = -0.1
tol = 1e-10
nsteps = 7

for step in range(nsteps):
    for iteration in range(10):
        c = (step + 1.) / nsteps

        du_D = u.copy()
        x, y, z = basis.doflocs[:, dofs.nodal['u^1']]
        du_D[dofs.nodal['u^1']] = c * right - du_D[dofs.nodal['u^1']]
        du_D[dofs.nodal['u^2']] = (
            y * np.cos(c * np.pi) - z * np.sin(c * np.pi) - y
            - du_D[dofs.nodal['u^2']]
        )
        du_D[dofs.nodal['u^3']] = (
            y * np.sin(c * np.pi) + z * np.cos(c * np.pi) - z
            - du_D[dofs.nodal['u^3']]
        )

        du = solve(*condense(K, -f, x=du_D, D=dirichlet))
        norm_du = np.linalg.norm(du)
        u += du

        uv = basis.interpolate(u)

        f = L.assemble(basis, displacement=uv)
        K = a.assemble(basis, displacement=uv)

        print(1 + iteration, norm_du)

        if norm_du < tol:
            break

if __name__ == '__main__':
    (mesh.translated(u[basis.nodal_dofs])
         .draw('vedo', point_data={'uy': u[basis.nodal_dofs[1]]})
         .show())

I made some benchmarks and it seems that neither the number of quadrature points or the number of elements has a large effect on the assembly time, but the number of basis functions has. And for ElementVector(ElementHex1()) this is already 24 and the linearization is performed within the loop 24 x 24 times and that's where the slowness comes from. Two dimensional examples run quite quick because they have much less linearizations.

I was able to make it approximately one magnitude faster by caching some of those derivatives within the basis function loop. Some generality is lost but let's see if I can recover that later.

Here is one example which takes around 4 secs per assembly on my laptop

Out of interest, I re-wrote your example using autograd. Assembly time ~2.7s on my laptop.
from skfem import *
from skfem.helpers import grad, eye
import time

import numpy as np
from autograd import numpy as anp, make_hvp

m = MeshHex().refined(3)
basis = Basis(m, ElementVector(ElementHex1()), intorder=1)
mu, lmbda = 1., 2.

# autograd helpers
transpose = lambda T: anp.einsum("ij...->ji...", T)
ddot = lambda u, v: anp.einsum("ij...,ij...->...", u, v)
mul = lambda u, v: anp.einsum("ij...,jk...->ik...", u, v)
det = lambda T: anp.linalg.det(T.T).T

def functional(F):
    J = det(F)
    lnJ = anp.log(J)
    I1 = ddot(F, F)
    return anp.sum(mu / 2. * (I1 - 3.) - mu * lnJ + lmbda / 2. * lnJ ** 2)

@BilinearForm
def a(u, v, w):
    dF = grad(w['prev'])
    dv = grad(v)
    du = grad(u)
    F = eye(np.ones(dv.shape[-2:]), 3) + dF
    return ddot(make_hvp(functional)(F)[0](du), dv)

@LinearForm
def L(v, w):
    dF = grad(w['prev'])
    dv = grad(v)
    F = eye(np.ones(dv.shape[-2:]), 3) + dF
    return ddot(make_hvp(functional)(F)[1], dv)

x = basis.project(lambda x: np.array([x[0] / 10., x[1] * 0., x[2] * 0.]))
D = basis.get_dofs(lambda x: np.isclose(x[0], 0) + np.isclose(x[0], 1))

for itr in range(50):

    w = basis.interpolate(x)
    start = time.time()
    J = asm(a, basis, prev=w)
    f = asm(L, basis, prev=w)
    stop = time.time()
    print('Assembly time: {} seconds'.format(stop - start))

    xprev = x.copy()
    x += solve(*condense(J, -f, D=D))

    res = np.linalg.norm(x - xprev)
    print('Residual: {}'.format(res))
    if res < 1e-8:
        break

mdefo = m.translated(x[basis.nodal_dofs])
m.draw().show()
mdefo.draw().show()

this is already 24 and the linearization is performed within the loop 24 x 24 times and that's where the slowness comes from.

I think I may have asked this before, but could you explain why we need to loop for a full 24 x 24 matrix?  Its been a while since I looked at the vectorized assembly procedure  but my hunch was that you could only loop for the relevant indices for each component. (for u_x -- 8, for u_y --8 and for u_z -- 8) or is this what it is doing? For u-x you wouldn't need to loop over the indices for u_y and u_z and so on.. where u_i's are essentially the local basis functions for the i-th component of the field..

Those different directions affect each other, right? There might be other, more solid mechanics specific ways of assembling. However, here the thinking is that if you have ElementHex1() with phi_1, phi_2, ..., phi_8 and you make it ElementVector(ElementHex1()) then you have the local basis (phi_1, 0, 0), (phi_2, 0, 0), ..., (phi_8, 0, 0), (0, phi_1, 0), ..., (0, phi_8, 0), (0, 0, phi_1), ..., (0, 0, phi_8) which is 24 basis functions in total and, in general, all have nontrivial energy inner products. This means the local matrices are 24 x 24 matrices with nontrivial entries.

I've thought about allowing the specification of some structure, e.g., symmetry which would get rid of about half of the form evaluations for larger bases. Haven't gotten to it yet since I don't do vectorial 3D problems too often.

Those different directions affect each other, right? There might be other, more solid mechanics specific ways of assembling. However, here the thinking is that if you have ElementHex1() with phi_1, phi_2, ..., phi_8 and you make it ElementVector(ElementHex1()) then you have the local basis (phi_1, 0, 0), (phi_2, 0, 0), ..., (phi_8, 0, 0), (0, phi_1, 0), ..., (0, phi_8, 0), (0, 0, phi_1), ..., (0, 0, phi_8) which is 24 basis functions in total and, in general, all have nontrivial energy inner products. This means the local matrices are 24 x 24 matrices with nontrivial entries.

Hmm.. I think you are right. I was thinkining only about the gradients of the local-basis function d(phi_1)/dx, ...  and so on (that would have a banded structure , say if you have cell_dofs = [cell_dofs_x, cell_dofs_y, cell_dofs_z] ) but not the energy inner product with the hessian..

Seems that Autograd and JAX perform nearly equal if no jit-compilation is used.

@adtzlr I did a quick check with both (Autograd version 1.4 and jax) on my windows laptop and it turns out that autograd is slightly faster. But with the changes in skfem.experimental.autodiff especially now with the NonlinearForm I am at least able to run ex43 without any problems

Autograd
import numpy as np

from skfem import *
from skfem.helpers import grad, identity
from autograd import numpy as anp, jacobian as jac, make_hvp

# helpers
ddot = lambda u, v: anp.einsum("ij...,ij...->...", u, v)
det = lambda T: anp.linalg.det(T.T).T

# note: rough mesh to make tests fast
mesh = MeshHex.init_tensor(
    np.linspace(0, 1, 10),
    np.linspace(-.1, .1, 3),
    np.linspace(-.1, .1, 3),
).refined().with_boundaries({
    'left': lambda x: x[0] == 0.,
    'right': lambda x: x[0] == 1.,
})
element = ElementVector(ElementHex1())
basis = Basis(mesh, element, intorder=1)

def deformation_gradient(w):
    dudX = grad(w["displacement"])
    F = dudX + identity(dudX)
    return F

def W(F, mu=1.0, lmbda=2.0):
    r"""The strain energy density function per unit undeformed volume of the
    isotropic hyperelastic Neo-Hookean material formulation is given as

    ..  math::

        \psi(\boldsymbol{F}) = \frac{\mu}{2} ( I_1 - 3) - \mu \ln(J) +
        \frac{\lambda}{2} \ln^2(J)

    """

    I1 = ddot(F, F)
    J = det(F)
    lnJ = anp.log(J)

    return anp.sum(mu / 2 * (I1 - 3) - mu * lnJ + lmbda * lnJ ** 2 / 2)

@LinearForm
def L(v, w):
    F = deformation_gradient(w)
    dF = grad(v)
    return ddot(make_hvp(W)(F)[1], dF)

@BilinearForm
def a(u, v, w):
    F = deformation_gradient(w)
    DF = grad(u)
    dF = grad(v)
    return ddot(make_hvp(W)(F)[0](DF), dF)

u  = basis.zeros()
du = basis.zeros()
uv = basis.interpolate(u)

dofs = basis.get_dofs('right')
dirichlet = basis.get_dofs({'right', 'left'})

f = L.assemble(basis, displacement=uv)
K = a.assemble(basis, displacement=uv)

right = -0.1
tol = 1e-10
nsteps = 7

from time import time

times = []

for step in range(nsteps):
    print(f"Step: {step+1:d}")
    for iteration in range(10):
        c = (step + 1.) / nsteps

        du_D = u.copy()
        x, y, z = basis.doflocs[:, dofs.nodal['u^1']]
        du_D[dofs.nodal['u^1']] = c * right - du_D[dofs.nodal['u^1']]
        du_D[dofs.nodal['u^2']] = (
            y * np.cos(c * np.pi) - z * np.sin(c * np.pi) - y
            - du_D[dofs.nodal['u^2']]
        )
        du_D[dofs.nodal['u^3']] = (
            y * np.sin(c * np.pi) + z * np.cos(c * np.pi) - z
            - du_D[dofs.nodal['u^3']]
        )

        du = solve(*condense(K, -f, x=du_D, D=dirichlet))
        norm_du = np.linalg.norm(du)
        u += du

        uv = basis.interpolate(u)
        t1 = time()
        f = L.assemble(basis, displacement=uv)
        K = a.assemble(basis, displacement=uv)
        times.append(time() - t1)
        norm_df = np.linalg.norm(f[basis.complement_dofs(dirichlet)])

        # print(1 + iteration, norm_du)
        print(f"Newton iteration: {iteration+1:d} | du: {norm_du:.3e} | df: {norm_df:.3e}")

        if norm_df < tol:
            break

mesh.save('disps_auto.xdmf', point_data={'disps': u[basis.nodal_dofs].T})
print(f"Assemble time average: {np.mean(times):.3e}")

Jax

from skfem import *
from skfem.experimental.autodiff import NonlinearForm
from skfem.experimental.autodiff.helpers import *
import jax.numpy as np
import time
import jax
import numpy as onp
jax.config.update("jax_enable_x64", True)
jax.config.update("jax_platform_name", "cpu")

# note: rough mesh to make tests fast
m = MeshHex.init_tensor(
    np.linspace(0, 1, 10),
    np.linspace(-.1, .1, 3),
    np.linspace(-.1, .1, 3),
).refined().with_boundaries({
    'left': lambda x: x[0] == 0.,
    'right': lambda x: x[0] == 1.,
})
# element = ElementVector(ElementHex1())
# basis = Basis(mesh, element, intorder=1)
basis = Basis(m, ElementVector(ElementHex1()), intorder=1)
mu, lmbda = 1., 2.

@NonlinearForm(nthreads=2)
def G(u, w):
    du = grad(u)
    F = eye(np.ones(du.shape[-2:]), 3) + du
    J = det(F)
    I1 = ddot(F, F)
    return mu / 2. * (I1 - 3.) - mu * (J-1) + lmbda / 2. * (J-1) ** 2

u  = basis.zeros()
du = basis.zeros()
uv = basis.interpolate(u)

dofs = basis.get_dofs('right')
dirichlet = basis.get_dofs({'right', 'left'})

J, f = G.assemble(u, basis)

right = -0.1
tol = 1e-10
nsteps = 7
from time import time
times = []

for step in range(nsteps):
    print(f"Step: {step+1:d}")
    for iteration in range(10):
        c = (step + 1.) / nsteps

        du_D = u.copy()
        x, y, z = basis.doflocs[:, dofs.nodal['u^1']]
        du_D[dofs.nodal['u^1']] = c * right - du_D[dofs.nodal['u^1']]
        du_D[dofs.nodal['u^2']] = (
            y * np.cos(c * np.pi) - z * np.sin(c * np.pi) - y
            - du_D[dofs.nodal['u^2']]
        )
        du_D[dofs.nodal['u^3']] = (
            y * np.sin(c * np.pi) + z * np.cos(c * np.pi) - z
            - du_D[dofs.nodal['u^3']]
        )

        du = solve(*condense(J, -f, x=du_D, D=dirichlet))
        norm_du = np.linalg.norm(du)
        u += du

        uv = basis.interpolate(u)
        t1 = time()
        J, f = G.assemble(u, basis)
        times.append(time() - t1)
        norm_df = np.linalg.norm(f[basis.complement_dofs(dirichlet)])
        # print(1 + iteration, norm_df)
        print(f"Newton iteration: {iteration+1:d} | du: {norm_du:.3e} | df: {norm_df:.3e}")
        if norm_df < tol:
            break

m.save('disps.xdmf', point_data={'disps': u[basis.nodal_dofs].T})
print(f"Assemble time average: {onp.mean(times):.3e}")

Autograd/Jax average assembly time (& residuals)
Step: 1
Newton iteration: 1 | du: 5.974e-01 | df: 9.542e-03
Newton iteration: 2 | du: 9.244e-02 | df: 7.066e-04
Newton iteration: 3 | du: 4.438e-02 | df: 7.479e-05
Newton iteration: 4 | du: 1.391e-02 | df: 7.373e-06
Newton iteration: 5 | du: 7.690e-04 | df: 2.213e-08
Newton iteration: 6 | du: 4.728e-06 | df: 8.417e-13
Step: 2
Newton iteration: 1 | du: 5.975e-01 | df: 9.471e-03
Newton iteration: 2 | du: 9.207e-02 | df: 6.938e-04
Newton iteration: 3 | du: 4.641e-02 | df: 8.112e-05
Newton iteration: 4 | du: 1.418e-02 | df: 7.578e-06
Newton iteration: 5 | du: 8.527e-04 | df: 2.695e-08
Newton iteration: 6 | du: 5.380e-06 | df: 1.078e-12
Step: 3
Newton iteration: 1 | du: 5.975e-01 | df: 9.401e-03
Newton iteration: 2 | du: 9.171e-02 | df: 6.811e-04
Newton iteration: 3 | du: 4.835e-02 | df: 8.733e-05
Newton iteration: 4 | du: 1.439e-02 | df: 7.723e-06
Newton iteration: 5 | du: 9.331e-04 | df: 3.195e-08
Newton iteration: 6 | du: 5.984e-06 | df: 1.320e-12
Step: 4
Newton iteration: 1 | du: 5.974e-01 | df: 9.332e-03
Newton iteration: 2 | du: 9.135e-02 | df: 6.686e-04
Newton iteration: 3 | du: 5.023e-02 | df: 9.341e-05
Newton iteration: 4 | du: 1.454e-02 | df: 7.806e-06
Newton iteration: 5 | du: 1.008e-03 | df: 3.695e-08
Newton iteration: 6 | du: 6.511e-06 | df: 1.546e-12
Step: 5
Newton iteration: 1 | du: 5.973e-01 | df: 9.264e-03
Newton iteration: 2 | du: 9.098e-02 | df: 6.560e-04
Newton iteration: 3 | du: 5.202e-02 | df: 9.933e-05
Newton iteration: 4 | du: 1.464e-02 | df: 7.826e-06
Newton iteration: 5 | du: 1.077e-03 | df: 4.177e-08
Newton iteration: 6 | du: 6.940e-06 | df: 1.738e-12
Step: 6
Newton iteration: 1 | du: 5.971e-01 | df: 9.195e-03
Newton iteration: 2 | du: 9.059e-02 | df: 6.434e-04
Newton iteration: 3 | du: 5.376e-02 | df: 1.051e-04
Newton iteration: 4 | du: 1.468e-02 | df: 7.790e-06
Newton iteration: 5 | du: 1.140e-03 | df: 4.630e-08
Newton iteration: 6 | du: 7.263e-06 | df: 1.884e-12
Step: 7
Newton iteration: 1 | du: 5.967e-01 | df: 9.126e-03
Newton iteration: 2 | du: 9.018e-02 | df: 6.306e-04
Newton iteration: 3 | du: 5.545e-02 | df: 1.109e-04
Newton iteration: 4 | du: 1.468e-02 | df: 7.705e-06
Newton iteration: 5 | du: 1.196e-03 | df: 5.050e-08
Newton iteration: 6 | du: 7.486e-06 | df: 1.981e-12

Assemble time average: 3.394e+00

vs Jax
Step: 1
Newton iteration: 1 | du: 5.931e-01 | df: 7.294e-03
Newton iteration: 2 | du: 7.685e-02 | df: 5.711e-04
Newton iteration: 3 | du: 3.202e-02 | df: 2.458e-05
Newton iteration: 4 | du: 5.443e-03 | df: 7.505e-07
Newton iteration: 5 | du: 6.135e-05 | df: 1.018e-10
Newton iteration: 6 | du: 3.742e-08 | df: 3.585e-17
Step: 2
Newton iteration: 1 | du: 5.919e-01 | df: 7.085e-03
Newton iteration: 2 | du: 7.653e-02 | df: 5.552e-04
Newton iteration: 3 | du: 3.244e-02 | df: 2.529e-05
Newton iteration: 4 | du: 5.556e-03 | df: 7.630e-07
Newton iteration: 5 | du: 6.690e-05 | df: 1.170e-10
Newton iteration: 6 | du: 4.153e-08 | df: 4.385e-17
Step: 3
Newton iteration: 1 | du: 5.906e-01 | df: 6.875e-03
Newton iteration: 2 | du: 7.620e-02 | df: 5.396e-04
Newton iteration: 3 | du: 3.291e-02 | df: 2.602e-05
Newton iteration: 4 | du: 5.647e-03 | df: 7.692e-07
Newton iteration: 5 | du: 7.238e-05 | df: 1.325e-10
Newton iteration: 6 | du: 4.531e-08 | df: 5.283e-17
Step: 4
Newton iteration: 1 | du: 5.891e-01 | df: 6.662e-03
Newton iteration: 2 | du: 7.587e-02 | df: 5.243e-04
Newton iteration: 3 | du: 3.342e-02 | df: 2.677e-05
Newton iteration: 4 | du: 5.717e-03 | df: 7.694e-07
Newton iteration: 5 | du: 7.769e-05 | df: 1.478e-10
Newton iteration: 6 | du: 4.861e-08 | df: 5.882e-17
Step: 5
Newton iteration: 1 | du: 5.874e-01 | df: 6.446e-03
Newton iteration: 2 | du: 7.553e-02 | df: 5.093e-04
Newton iteration: 3 | du: 3.398e-02 | df: 2.755e-05
Newton iteration: 4 | du: 5.767e-03 | df: 7.640e-07
Newton iteration: 5 | du: 8.278e-05 | df: 1.625e-10
Newton iteration: 6 | du: 5.136e-08 | df: 6.202e-17
Step: 6
Newton iteration: 1 | du: 5.855e-01 | df: 6.230e-03
Newton iteration: 2 | du: 7.520e-02 | df: 4.948e-04
Newton iteration: 3 | du: 3.458e-02 | df: 2.835e-05
Newton iteration: 4 | du: 5.798e-03 | df: 7.540e-07
Newton iteration: 5 | du: 8.761e-05 | df: 1.763e-10
Newton iteration: 6 | du: 5.352e-08 | df: 6.848e-17
Step: 7
Newton iteration: 1 | du: 5.832e-01 | df: 6.012e-03
Newton iteration: 2 | du: 7.488e-02 | df: 4.807e-04
Newton iteration: 3 | du: 3.522e-02 | df: 2.918e-05
Newton iteration: 4 | du: 5.812e-03 | df: 7.404e-07
Newton iteration: 5 | du: 9.216e-05 | df: 1.892e-10
Newton iteration: 6 | du: 5.513e-08 | df: 7.022e-17
Assemble time average: 5.820e+00

Slight differences in the residual, but overall seems that Autograd is slightly faster on my laptop at least.

I appreciate these timing. However, as you might be aware, these are not really comparing apples to apples because the version in this branch evaluates the Jacobian with respect to all parameters of DiscreteField (values, gradients, second derivatives, etc.) and thus supporting arbitrary forms. It is however nice to something to compare against when looking for possible optimizations.
Here I'm solving the Navier-Stokes equations:
from skfem import *
from skfem.experimental.autodiff import NonlinearForm
from skfem.experimental.autodiff.helpers import *
import numpy as np

m = MeshTri().refined(3)
basis = Basis(m, ElementVector(ElementTriP2()) * ElementTriP1())

@NonlinearForm
def F(u, p, v, q, w):
    return (ddot(grad(u), grad(v))
            - dot(mul(grad(u), u[0]), v[0])
            - 1e-2 * p[0] * q[0]
            - div(u) * q[0]
            - div(v) * p[0])

x = basis.zeros()
D = basis.get_dofs().all(['u^1^1', 'u^2^1'])
x[basis.get_dofs('top').all(['u^1^1'])] = 100.

for itr in range(50):

    J, f = F.assemble(x, basis)

    xprev = x.copy()
    x += solve(*condense(J, -f, D=D))

    res = np.linalg.norm(x - xprev)
    print(res)
    if res < 1e-8:
        break

(u, ubasis), (p, pbasis) = basis.split(x)

pbasis.plot(p).show()
ubasis.plot(u).show()

Ugh, I made a variant using autograd.make_jvp and it is about 3 times faster than JAX.

Ugh, I made a variant using autograd.make_jvp and it is about 3 times faster than JAX.

Wait, is that so? I was following the updates this morning and to me example 10 with Jax instead of Autograd was faster (and quite fast honestly). I may have to revert to the commit before the last one to check things systematically later today, but I was testing the average assembly time per Newton iteration:

Autograd
r"""Automatic differentiation.

Warning: This example uses experimental features.

This example solves the minimal surface problem from example 10 using automatic
differentation in order to derive the tangent system for Newton's method.

"""
from skfem import *
from skfem.experimental.autodiff import NonlinearForm
from skfem.experimental.autodiff.helpers import grad, dot
import numpy as np
import autograd.numpy as anp

m = MeshTri().refined(7)

@NonlinearForm(hessian=True)
def energy(u, _):
    return anp.sqrt(1. + dot(grad(u), grad(u)))

basis = Basis(m, ElementTriP1())

D = m.boundary_nodes()
x = np.sin(np.pi * m.p[0])

from time import time
times = []
for itr in range(100):
    t1 = time()
    J, F = energy.assemble(x, basis)
    t2 = time()
    times.append(t2 - t1)

    x_prev = x.copy()
    x += 0.7*solve(*condense(J, -F, D=D))
    res = np.linalg.norm(x - x_prev)
    if res < 1e-8:
        break
    if __name__ == "__main__":
        print(res)

print(np.mean(times))

Manual
from skfem import *
from skfem.helpers import grad, dot
import numpy as np

m = MeshTri().refined(7)

@BilinearForm
def jacobian(u, v, p):
    w = p['prev']
    return (1 / np.sqrt(1 + dot(grad(w), grad(w))) * dot(grad(u), grad(v))
            -2 * dot(grad(u), grad(w)) * dot(grad(w), grad(v))
            / 2 / (1 + dot(grad(w), grad(w))) ** (3 / 2))

@LinearForm
def rhs(v, p):
    w = p['prev']
    return dot(grad(w), grad(v)) / np.sqrt(1 + dot(grad(w), grad(w)))

basis = Basis(m, ElementTriP1())

x = basis.zeros()

D = m.boundary_nodes()
x[D] = np.sin(np.pi * m.p[0, D])
from time import time
times = []
for itr in range(100):
    w = basis.interpolate(x)
    t1 = time()
    J = asm(jacobian, basis, prev=w)
    F = asm(rhs, basis, prev=w)
    t2 = time()
    times.append(t2 - t1)
    x_prev = x.copy()
    x += 0.7*solve(*condense(J, -F, D=D))
    if np.linalg.norm(x - x_prev) < 1e-8:
        break
    if __name__ == "__main__":
        print(np.linalg.norm(x - x_prev))

print(np.mean(times))

Jax
from skfem import *
from skfem.experimental.autodiff import NonlinearForm
from skfem.experimental.autodiff.helpers import grad, dot
import numpy as np
import jax.numpy as jnp

m = MeshTri().refined(7)

@NonlinearForm
def energy(u, _):
    return jnp.sqrt(1. + dot(grad(u), grad(u)))

basis = Basis(m, ElementTriP1())

D = m.boundary_nodes()
x = np.sin(np.pi * m.p[0])

from time import time
times = []
for itr in range(100):
    t1 = time()
    J, F = energy.assemble(x, basis)
    times.append(time() - t1)
    x_prev = x.copy()
    x += 0.7*solve(*condense(J, -F, D=D))
    res = np.linalg.norm(x - x_prev)
    if res < 1e-8:
        break
    if __name__ == "__main__":
        print(res)

print(np.mean(times))

And the times were something like 0.11 for manual, 0.14 for Jax and now 0.23 for autograd. But TBD...

I tested the nonlinear elasticity example and there assembly was down to about 1 seconds (autograd) from about 4 seconds (jax).

Code:
from skfem import *
from skfem.experimental.autodiff import NonlinearForm
from skfem.experimental.autodiff.helpers import *
import autograd.numpy as np
import time

m = MeshHex().refined(3)
basis = Basis(m, ElementVector(ElementHex1()), intorder=1)
mu, lmbda = 1., 2.

@NonlinearForm(hessian=True)
def G(u, w):
    du = grad(u)
    F = eye(np.ones(du.shape[-2:]), 3) + du
    J = det(F)
    lnJ = np.log(J)
    I1 = ddot(F, F)
    return mu / 2. * (I1 - 3.) - mu * lnJ + lmbda / 2. * lnJ ** 2

x = basis.project(lambda x: np.array([x[0] / 10., x[1] * 0., x[2] * 0.]))
D = basis.get_dofs(lambda x: np.isclose(x[0], 0) + np.isclose(x[0], 1))

for itr in range(50):

    start = time.time()
    J, f = G.assemble(x, basis)
    stop = time.time()
    print('Assembly time: {} seconds'.format(stop - start))

    xprev = x.copy()
    x += solve(*condense(J, -f, D=D))

    res = np.linalg.norm(x - xprev)
    print('Residual: {}'.format(res))
    if res < 1e-8:
        break

mdefo = m.translated(x[basis.nodal_dofs])
m.draw().show()
mdefo.draw().show()

Here is what I have running the above:
Assembly time: 1.43265962600708 seconds
Residual: 0.3220785730519255
Assembly time: 1.42574143409729 seconds
Residual: 0.008043863608335308
Assembly time: 1.4221115112304688 seconds
Residual: 1.238790544973782e-05
Assembly time: 1.431492567062378 seconds
Residual: 4.522337656560638e-11

With JAX it was ~4.3 seconds.

Example 45 takes less than 0.01 seconds per assembly.

kes less than 0.01 seconds per asse

I'll test example 45. Just looking at your numbers and mine I don't think things remain the same in 2D and 3D. I just reverted to 8a365f5f2d48e1bdef3ee1484bf9cd39b7c2106d and tested jax and the timings are 0.113 for manual and 0.14 for Jax and 0.242 for Autograd.

Cool similar numbers.. With Jax and the following code
from skfem import *
from skfem.experimental.autodiff import NonlinearForm
from skfem.experimental.autodiff.helpers import grad
from skfem.element import DiscreteField
from skfem.assembly.form.form import FormExtraParams
from typing import Union
from numpy import ndarray
FieldOrArray = Union[DiscreteField, ndarray]
import numpy as np
import jax.numpy as jnp
import time

m = MeshHex().refined(3)
basis = Basis(m, ElementVector(ElementHex1()), intorder=1)
mu, lmbda = 1., 2.

def dot(u: FieldOrArray, v: FieldOrArray):
    """Dot product."""
    if isinstance(u, DiscreteField) and u.is_zero():
        return u
    if isinstance(v, DiscreteField) and v.is_zero():
        return v
    return jnp.einsum('i...,i...', u, v)

def ddot(u: FieldOrArray, v: FieldOrArray):
    """Double dot product."""
    if isinstance(u, DiscreteField) and u.is_zero():
        return u
    if isinstance(v, DiscreteField) and v.is_zero():
        return v
    return jnp.einsum('ij...,ij...', u, v)

def eye(w, n):
    """Create diagonal matrix with w on diagonal."""
    return jnp.array([[w if i == j else 0. * w for i in range(n)]
                     for j in range(n)])

def det(A):
    """Determinant of an array `A` over trailing axis (if any)."""
    detA = jnp.zeros_like(A[0, 0])
    if A.shape[0] == 3:
        detA = A[0, 0] * (A[1, 1] * A[2, 2] -
                          A[1, 2] * A[2, 1]) -\
               A[0, 1] * (A[1, 0] * A[2, 2] -
                          A[1, 2] * A[2, 0]) +\
               A[0, 2] * (A[1, 0] * A[2, 1] -
                          A[1, 1] * A[2, 0])
    elif A.shape[0] == 2:
        detA = A[0, 0] * A[1, 1] - A[1, 0] * A[0, 1]
    return detA

@NonlinearForm(hessian=True)
def G(u, w):
    du = grad(u)
    F = eye(jnp.ones(du.shape[-2:]), 3) + du
    J = det(F)
    lnJ = jnp.log(J)
    I1 = ddot(F, F)
    return mu / 2. * (I1 - 3.) - mu * lnJ + lmbda / 2. * lnJ ** 2

x = basis.project(lambda x: np.array([x[0] / 10., x[1] * 0., x[2] * 0.]))
D = basis.get_dofs(lambda x: np.isclose(x[0], 0) + np.isclose(x[0], 1))

for itr in range(50):

    start = time.time()
    J, f = G.assemble(x, basis)
    stop = time.time()
    print('Assembly time: {} seconds'.format(stop - start))

    xprev = x.copy()
    x += solve(*condense(J, -f, D=D))

    res = np.linalg.norm(x - xprev)
    print('Residual: {}'.format(res))
    if res < 1e-8:
        break

mdefo = m.translated(x[basis.nodal_dofs])
m.draw().show()
mdefo.draw().show()

I get
Assembly time: 13.871878147125244 seconds
Residual: 0.3220785730519255
Assembly time: 10.271016120910645 seconds
Residual: 0.008043863608335282
Assembly time: 10.850549459457397 seconds
Residual: 1.2387905449715476e-05
Assembly time: 10.949408531188965 seconds
Residual: 4.522337223516465e-11

and Autograd and the following code
from skfem import *
from skfem.experimental.autodiff import NonlinearForm
from skfem.experimental.autodiff.helpers import *
import autograd.numpy as np
import time

m = MeshHex().refined(3)
basis = Basis(m, ElementVector(ElementHex1()), intorder=1)
mu, lmbda = 1., 2.

@NonlinearForm(hessian=True)
def G(u, w):
    du = grad(u)
    F = eye(np.ones(du.shape[-2:]), 3) + du
    J = det(F)
    lnJ = np.log(J)
    I1 = ddot(F, F)
    return mu / 2. * (I1 - 3.) - mu * lnJ + lmbda / 2. * lnJ ** 2

x = basis.project(lambda x: np.array([x[0] / 10., x[1] * 0., x[2] * 0.]))
D = basis.get_dofs(lambda x: np.isclose(x[0], 0) + np.isclose(x[0], 1))

for itr in range(50):

    start = time.time()
    J, f = G.assemble(x, basis)
    stop = time.time()
    print('Assembly time: {} seconds'.format(stop - start))

    xprev = x.copy()
    x += solve(*condense(J, -f, D=D))

    res = np.linalg.norm(x - xprev)
    print('Residual: {}'.format(res))
    if res < 1e-8:
        break

mdefo = m.translated(x[basis.nodal_dofs])
m.draw().show()
mdefo.draw().show()

I get
Assembly time: 1.7155475616455078 seconds
Residual: 0.32207857305192544
Assembly time: 1.6871576309204102 seconds
Residual: 0.008043863608335288
Assembly time: 1.701439380645752 seconds
Residual: 1.2387905449711992e-05
Assembly time: 1.6698722839355469 seconds
Residual: 4.52233849072165e-11

which for me is about ~6x faster than Jax..

Personally I'd ask the developers of Autograd/JAX (same team) if we have two examples. I think there is a relatively simple explanation for the timings. Plus, with JAX there is the (currently unused) jit option. While I personally really like Autograd, JAX is the succesor of it and it is the package which is actively maintained...

Change from autograd to JAX is rather simple, affects just a few lines of code, so we can go back to JAX if it gets faster in the future.


Throwing error while performing browser back

Excepted Behaviour
User should be able to navigate back successfully.
Actual Behaviour
Currently its timeout error.
Steps to reproduce

openBrowser()
goto("google.com")
goBack()

Version: 0.5.0 (Chromium:73.0.3665.0)

@Debashis9012 Does the goBack() led to about:blank ?

Tested this and it takes to about blank. Once I got the timeout, but that's
for goto I guess
On Thu, Feb 7, 2019 at 6:32 PM Sai Krishna<EMAIL_ADDRESS>wrote:

@Debashis9012 https://github.com/Debashis9012 Does the goBack() led to
about:blank ?
—
You are receiving this because you are subscribed to this thread.
Reply to this email directly, view it on GitHub
https://github.com/getgauge/taiko/issues/389#issuecomment-461409934, or mute
the thread
https://github.com/notifications/unsubscribe-auth/AAQ3YhGPKdR13yCpvjgxUBpkpl9bMJwSks5vLCPfgaJpZM4anC5h
.

--
Thanks,
Jaydeep
Contact: +91-9740980456

@saikrishna321 Yes it was throwing error only if we are navigating back to blank page.
After skip wait for blank page it works fine.

Facing the same issue once again so reopening it. Kindly find the below steps
> openBrowser()
 ✔ Browser opened
> goto("google.com")
 ✔ Navigated to URL http://google.com
> goBack()
 ✘ Error: Navigation took more than 30000ms. Please increase the navigationTimeout., run `.trace` for more info.
> .exit
➜  ~ taiko -v
Version: 1.0.3 (Chromium: 79.0.3945.16) b9cbccc6fdaedeee91b2adcd92c94c6c5f8ec600

This issue has been verified and found fixed.
Tested version: ec553bc7ed8776cd2fbbcee995e1832f833a1057


A pair of two images as  input channel.

Dear Author;
Thanks for sharing the nice tool.
I would like to ask if this tool can receive a pair of two input images. I mean my model takes a pair of images in the input channel of the model. How can I extend your tools to take a pair of images?
Thanks in advance.

Hi, the gradient-based explainers for image assume that the model takes one image as its input. But you can implement a wrap over the model to handle two input images, e.g., the model takes two images as its inputs, while the wrap returns a new model that takes one image (you want to analyze) and treats the other image as a fixed variable.
For example, suppose we have a pytorch model M that has a forward function "forward(x, y)". The wrap can be something like this:
class NewModel(nn.module):
def init(m, y):
self.model = m
self.y = y
def forward(x):
    return self.model(x, self.y)

This is just an example. You can implement the wrap according to your applications.


chore: Remove the Phylum Action in favor of the GitHub App

Pull request details
Description of the change

Description here

Type of change

[ ] Bug fix (non-breaking change that fixes an issue)
[ ] New feature (non-breaking change that adds functionality)
[ ] Breaking change (fix or feature that would cause existing functionality to not work as expected)

Checklists
Development

[ ] Lint rules pass locally
[ ] The code changed/added as part of this pull request has been covered with tests
[ ] All tests related to the changed code pass in development

Code review

[ ]  This pull request has a descriptive title and information useful to a reviewer. There may be a screenshot or screencast attached

@underdog-tech/core It looks like Phylum is encountering an error parsing the package-lock.json -- is that something y'all can take a look at and see if there's a problem with the lockfile? https://github.com/underdog-tech/react-modal/pull/66/checks?check_run_id=13350507229


themes and tags

Hi,
currently I'm using UNO. How do I get a list of the tags used onto the sidebar? Or is there another theme that provides navigation from a global tag list?
Hunting through the issues did not solve my "problem". Btw. the UNO-FAQ link to your site is broken.

Which FAQ link is that @thomaszahr ?

--

Sent from Mobile.

Hi,
http://daleanthony.com/uno-faq/

Sorry, I meant where is the broken link in the HubPress docs?
On Wed, 15 Feb 2017 at 23:01 thomaszahr<EMAIL_ADDRESS>wrote:

Hi,
http://daleanthony.com/uno-faq/
[image: bild1]
https://cloud.githubusercontent.com/assets/12052558/22975482/398c43f2-f387-11e6-9370-2a9eb0efeb90.png
—
You are receiving this because you commented.
Reply to this email directly, view it on GitHub
https://github.com/HubPress/hubpress.io/issues/478#issuecomment-280004614,
or mute the thread
https://github.com/notifications/unsubscribe-auth/AA6J2TD2zI2yHAUepN7Hei2Fxbjwnipnks5rcvclgaJpZM4MAs-z
.

--
Sent from Mobile.

Don't wanna derail, quick question.
Do all Ghost themes work for HubPress?

In the description of the uno theme. /themes/UNO/readied.md
Anyway, the question is how can I get a selection of tags onto the sidebar?

@thomaszahr
Actually you can't sorry

Pity

@jsiu22 There is a way to make them work, but it is far from intuitive.
https://hubpress.gitbooks.io/hubpress-knowledgebase/content/theme/develop_themes.html gives you the basic idea, but this will be changing as development for 0.7.0 moves forward.
My advice would be to wait for a bit. ;)

I'm going to close this one off. Not because it isn't a valid issue, but because the direction of customising themes will likely change away from customising the themes inside the forked repo and move to a more modular approach.


Add documentation for running codegen

Description
Need a brief description of the command-line parameters that are required to run the AbstractGenerator (code comment?).

Or just update the doc: https://consumerdatastandardsaustralia.github.io/engineering/artefacts/support/codegen/index.html

Or just update the doc: https://consumerdatastandardsaustralia.github.io/engineering/artefacts/support/codegen/index.html

Thanks dude. The whole engineering doc hasn't been updated since Jul. We'll have to do that as a big task.

👍

CodeGen is decommissioned.


Fix error formatting for pipeline enumeration exceptions

PR Summary
When the pipeline was invoking a IEnumerator.MoveNext implementation that threw an exception, that exception was failing to render. This was occuring because the formatter was trying to test for TargetObject.Line. The TargetObject in this case was the enumerator, so the engine attempted member access enumeration which threw the same exception.
This change fixes that by explicitly testing the type of TargetObject prior to attempting member access.
Fixes #20181

PR Context

PR Checklist

[x] PR has a meaningful title

Use the present tense and imperative mood when describing your changes

[x] Summarized changes
[x] Make sure all .h, .cpp, .cs, .ps1 and .psm1 files have the correct copyright header
[x] This PR is ready to merge and is not Work in Progress.

If the PR is work in progress, please add the prefix WIP: or [ WIP ] to the beginning of the title (the WIP bot will keep its status check at Pending while the prefix is present) and remove the prefix when the PR is ready.

Breaking changes

[x] None
OR
[ ] Experimental feature(s) needed

[ ] Experimental feature name(s):

User-facing changes

[x] Not Applicable
OR
[ ] Documentation needed

[ ] Issue filed:

Testing - New and feature

[ ] N/A or can only be tested interactively
OR
[x] Make sure you've added a new test if existing tests do not effectively test the code changed

Tooling

[x] I have considered the user experience from a tooling perspective and don't believe tooling will be impacted.
OR
[ ] I have considered the user experience from a tooling perspective and opened an issue in the relevant tool repository. This may include:

[ ] Impact on PowerShell Editor Services which is used in the PowerShell extension for VSCode
(which runs in a different PS Host).

[ ] Issue filed:

[ ] Impact on Completions (both in the console and in editors) - one of PowerShell's most powerful features.

[ ] Issue filed:

[ ] Impact on PSScriptAnalyzer (which provides linting & formatting in the editor extensions).

[ ] Issue filed:

[ ] Impact on EditorSyntax (which provides syntax highlighting with in VSCode, GitHub, and many other editors).

[ ] Issue filed:

@SteveL-MSFT Ah yep, I tested outside of an it block forgetting that pester will set error action in a way where the parameter level specification doesn't work.
Fixed!


fix(dataframes interface): select using a vector of columns

Missed this part of the interface in the implementation
Fixes https://github.com/JuliaParallel/DTables.jl/issues/53

Codecov Report
All modified lines are covered by tests :white_check_mark:

Comparison is base (94d66ed) 95.47% compared to head (43a2a03) 95.69%.

Additional details and impacted files
@@            Coverage Diff             @@
##             main      #55      +/-   ##
==========================================
+ Coverage   95.47%   95.69%   +0.22%
==========================================
  Files          12       12
  Lines         861      860       -1
==========================================
+ Hits          822      823       +1
+ Misses         39       37       -2

Files
Coverage Δ

src/operations/dataframes_interface.jl
94.36% <100.00%> (+4.08%)
:arrow_up:

... and 1 file with indirect coverage changes

:umbrella: View full report in Codecov by Sentry.
:loudspeaker: Have feedback on the report? Share it here.


bounding_tile issue

pip3 show mercantile
Name: mercantile
Version: 1.0.4

bounding_tile does not return the same tile that was used to create the bounding box.
>>> tile = mercantile.Tile(x=69327, y=45014, z=17)
>>> bounds = mercantile.bounds(tile)
>>> mercantile.bounding_tile(*bounds)
Tile(x=2166, y=1406, z=12)

The documentation seems to indicate that the behavior described is unexpected:

Get the smallest tile containing a geographic bounding box

Questions:
Is this working as intended?
Why is the zoom level so small?

So i tried checked if there is some error specific to the case where the bounds input to bounding_tile is equal to the bounding box of a tile.
>>> >>> w,s,e,n = mercantile.bounds(tile)
>>> offset = 1e-13
>>> mercantile.bounding_tile(w+offset,s+offset,e-offset,n-offset)
Tile(x=69327, y=45014, z=17)

So this fixes the issue.
>>> >>> w,s,e,n = mercantile.bounds(tile)
>>> offset = 1e-14
>>> mercantile.bounding_tile(w+offset,s+offset,e-offset,n-offset)
Tile(x=2166, y=1406, z=12)

And broken again.

@oteph I've got a solution going on in #101. Take a look if you'd like?


[#4429] Fix Error Retrieving Old Config Options

Add code to the doc/index.html file to handle the specific cases for version 0.8.1 and 0.7
of rustfmt where they don't have a explicit configuration.md file. Updated to pull the data
that is within the "Configuring Rustfmt" section of the original README

Thank you for the PR @jdollar. The ability to dynamically show-version specific configuration information on the site is a pretty new feature, and historically the site only showed the available config opts based on what was in the rustfmt source.
As such, I'd rather we just remove invalid versions from the available list, especially considering how ancient 0.8.1 and 0.7 are. The purpose of the site is to provide detailed information about the configuration options, so there's really no point in having special cases and extra code for these old edge cases where that core feature can't be met.
Would you be interested in updating this to remove those two from the list?

@calebcartwright For sure. Sounds good to me. I'll make that update to just get rid of the two ancient versions.

It is...a little more tame now. :wink: Just added a check on the filter condition that populates the variable used in the dropdown.
Additionally I removed that reMajorVersion variable since it looked like it wasn't getting used anywhere while I was in there. Let me know if that looks alright.

Thank you @jdollar! The frontend config site could probably use a little attention if you're interested (and plenty of work elsewhere within rustfmt too)


Fix execution in windows runner

Currently, when /windows-test command is added the workflow run tests with main branch and status is not updated, always listed as skipped.

/windows-test


Browse Data bug - filters under "Dataset IDs" not working

The EMPIAR ID filter seems not to work on certain entries that it should display, and causes other datasets to be displayed.
https://github.com/chanzuckerberg/cryoet-data-portal/assets/98626158/3ce19ea0-bf75-4ce6-ad05-8a46cbd3b56d

EMDB filter is now working as expected, thank you!


Regarding input data

Hi @astorfi
I have gone through your code. While extracting mfcc features for sample audio file it contains shape (420,40) here, 420 is number of frames and 40 is number of features.But In sample data of your code youre applying mfec feature file contains shape (3209,40,3). As per my understanding 3209 is Number of Frames,40 is Number of Features,3 Is number of Channels. I didn't understand the number of channels usage.can you please suggest how to create Feature_mfec.npy file in your format.

@abhishekkritarth, looks like you have not read the corresponding paper properly. The first channel is the actual MFEC features of the audio, while the second and third channel represent the 1st and 2nd derivative of the MFEC features respectively. They can be easily extracted using the functions available in speechpy library.

@abhishekkritarth For further information please take a look at the associated paper:
Text-Independent Speaker Verification Using 3D Convolutional Neural Networks.
The 3 is the number of channels which consists of static, first order and second order derivative features.
As @mmubeen-6 kindly mentioned, it can directly be extracted using SpeechPy.
Please let me know if you had any other question.

@astorfi Sorry to bother you.. This might be a silly question but I want to make sure if I understand correctly.
For the 3209 which is Number of Frames of MFEC, it should vary from different samples. But I don't need to trim them into 80(which is the input frame size you mentioned in the paper) before training. Am I correct?

@cp2923 No problem.
There is no trimming. However, you should choose how many of them you need. I case of my paper, only 80 consecutive frames are needed and it's a must as well!!
For example, 80 consecutive frames means 0.8-sec in case of using 10ms stride for generating features.
That 3209 you mentioned is for the whole sound file.
Please let me know if you had any other question.

@astorfi Thank you for your quick reply. So for the (3209,40,3) npy file, I should divide them into 40 npy file as the input of create_development.py?

@cp2923 I am a little bit confused about what you are trying to do. Let's say you want to feed some (80,40,3) cube to the network (discarding the batch dimension for now). So you get those 80s from 3209. Right? The create_development.py file is specific to the dataset that I used and it's just a sample. You do not need to be confused about it. Please read the paper in detail to realize what is the input pipeline.
Please refer to this post as well.
In any case, please do not hesitate to contact me if you had an issue.

@astorfi I think I totally understand. May I ask one more question? Why did you create two sessions under sample_data/1 ? Do I have to create a folder for each npy? Thanks!!

@cp2923 Sure. That was just an arbitrary naming for different files. There is nothing much there for considering.

@astorfi Thank you for your patient!

@cp2923  My pleasure. I will close this.

@astorfi
Hi, sorry to bother again.... I still feel a little confused when I read create_development.
Does folder 1 and 2 under sample_data denote two speaker?
What's the difference between train_files_subjects_list and train_files_subjects_ids?

@cp2923 Please ignore those naming conventions. That's database related. Please follow the paper.

@astorfi Thanks for your reply.
These questions seems too detailed to be mentioned in you paper. I think I need to know what  train_files_subjects_list and train_files_subjects_ids are, and then I can build the data input correctly.....


azOps: Missing Features discovered during the ESLZ Pilot

Hi all,
As you might know, we have conducted an ESLZ pilot. During this pilot, we discovered that azOps is missing various features:

Removing Policy Definitions, Sets and Assignments is not directly supported: So, when we are removing one of these objects (e.g. key-vault-policy-definition.json) from the repository, azOps Push does not pick up the change and subsequently remove the object. Instead, we need to remove it via for instance PowerShell and run azOps pull to ensure that the changes are made in the repository.
Interacting with multiple Azure Active Directory (AAD) objects is not supported.
Creating Exemptions is not supported: we want to move away from Exclusions (as they require you to redeploy a Policy Assignment) and use Exemptions instead. Unfortunately, this is not supported by azOps at the moment.

If you require additional information, please feel free to reach out to me via<EMAIL_ADDRESS>Cheers!

Hi all,
we are also looking for a way to handle exemptions in enterprise scale. Is there a way to get exemptions created using the azure portal into git using the pull pipeline? Is this topic on the roadmap?
Thanks for your great work!
Best regards
Timo

Thanks for the feedback. Yes, support for exemptions is in the backlog

Closing as these features are tracked as individual items in the AzOps repository already.
Microsoft.Authorization/policyExemptions: https://github.com/Azure/AzOps/issues/407
Resource Deletion: https://github.com/Azure/AzOps/issues/395


wayfinding: modals breadcrumbs

re: https://github.com/CartoDB/cartodb/issues/13127
this will eventually point to master once https://github.com/CartoDB/cartodb/pull/13185 is merged

I don't quite like the solution but this is a compromise we can make until all modals have been migrated to new styles

Tests pending

fixed the tests, and updated those modals where the breadcrumbs apply


Add dark mode & etc.

Dark mode:

Background #343434
Foreground/Text #ffffff
Links/Text #74acf4
Horizontal Rule #dddddd

Overall formatting:

Give the text some more breathing room
Maybe add some Bootstrap

This would really mean looking at the UI/UX as a whole. It is a little tacky and lacking currently.

Get some real advertisements
Eliminar el anuncio de Libre-de-Realeza

Sincerely,
@wackyblackie

Added dark mode per the colors above
Text now has more breathing room thanks to
Added Bootstrap 5.1.3. Same tacky UI looks better, though
Nope to advertisements
Nope to the last bullet point as well


OSError: [Errno 5] EIO

I got from example.py this error
Serial:<PHONE_NUMBER>0261716
Identifier:          unknown
Traceback (most recent call last):
File "", line 13, in
File "si7021.py", line 37, in temperature
File "si7021.py", line 72, in _get_data
OSError: [Errno 5] EIO
It crashes on ->   self.i2c.readfrom_into(self.address, data)
Any tips?

Hey I've not tested it on micropython, but on circuitpython I needed to use i2c.try_lock() and .unlock()
I've commited it here https://github.com/tyeth/micropython-si7021/blob/master/si7021.py
and these are the changes I made after getting this error:
RuntimeError: Function requires lock
https://github.com/tyeth/micropython-si7021/commit/71e0347c33fe22b99fe8a538196bed7def889646


Compile contracts under cfg(test) for foundry tests

Starknet-foundry relies on Scarb's starknet-contract target to compile contracts that can be used during test runtime. There is a use case for foundry's users to create contracts only for this purpose. Such contracts could be defined either in test files, or under cfg(test) attribute.  As of now, Scarb does not have any interface that would enable foundry to compile them.
cc @MaksymilianDemitraszek

I think this could lead to smearing too much abilities everywhere. Why not just establishing a pattern to write contracts in separate packages and focus on implementing #717 instead?

Decided to go with #717 instead

https://github.com/foundry-rs/starknet-foundry/issues/471


Docker compose

This PR allows the project to be started in docker.
Instructions for running the server and tasks are included in the README.

I think the tests should be passing on this updated docker version. Not sure why they are just pending.
It's what I'm using locally and shouldn't have any affect on running it without docker.

Weird that it's not updating here.
Here's both your PRs with all specs passing:

We'll this one is good to go. Will happily walk through it if your interested, but if your not using docker don't need to dwell on it

I haven't reviewed it all yet. Just thought I'd check the tests so you weren't concerned about it! I'll look later. Or maybe when we pair.


Sometimes figure does not save properly

Sometimes when exporting a .pdf for example using the code, export_fig(['/Users/Me/Folder/Graph'], '-transparent', '-pdf', '-painters');, the figure doesn't save correctly and it will end up saving a very small blank square instead of the graph that I want to save.
Why does this happen/how can this be fixed?

This is presumably a duplicate of issues #350 and #351, which were resolved in the latest version of export_fig. If this is not resolved in the latest version then let me know and I will reopen the issue.

This is presumably a duplicate of issues #350 and #351, which were resolved in the latest version of export_fig. If this is not resolved in the latest version then let me know and I will reopen the issue.

I just attempted this in v3.39 and had the same issue. This is on an ARM Mac with MatLab 2021b.

I don't know if it's related or it can help at all. I had a 'ghostly' large grey column appearing on the left of the saved/printed graph (in jpg) thus resizing the actual graph to a smaller window to the right. This 'ghostly' column seemed to show instructions at random of my running macro.
I addressed this by increasing the pause time at line 403 of export-fig.m from 0.05 to 0.2: finger crossed it seems to work so far although I haven't rerun many figures yet.


[SNAPSHOTS] Get info of each snapshot

Could I obtain information of a specific snapshot like when I use this endpoint /_snapshot/[REPO_NAME]/[SNAPSHOT_NAME]?
The reason is because:

I want to know which indices has each snapshot OR which indices has the last snapshot
Because as each day I generate a new index like (logstash_2019-06-01) I want to know if the last snapshot contains that index. If it doesn't contain that maybe something is misconfigured

Hi @luarx,
no, this isn't implemented. I'd rather do the consistency check immediately after creating the backup as handling with templated checks (like creating the index name from the current date) can't be done nicely in promQL.


Lint

Fix eslint process. Currently broken because of babel/es6 syntax in app. Also support different settings for dev mode.

Already on it.

Problem is to merge options once for dev mode and once for production mode.

Aha, so merging of options is like: base options are in .eslintrc and options from gulp task (api) are merged with .eslintrc?

Yep, exactly.
Separation between dev/prod is fixed and tested, I consider this done.


Name François not found with Francois

Current Behavior
The accent is not coerced to closest ASCII value
Expected Behavior
The accent should be ignored
Browser
No response
Steps To Reproduce
No response
Additional Details
No response
Priority
High

https://github.com/anyascii/anyascii

This must have been due to a typo two times in a row.


Allow nexd to choose an organization to connect to

nexd: Fix relay of non-default CIDRs
nexd: Support choosing an organization

commit 410d68231fc8b2da2ec74897b1915cf83bd93136
Author: Russell Bryant<EMAIL_ADDRESS>Date:   Sat May 27 08:48:45 2023 -0400
nexd: Fix relay of non-default CIDRs

nexd assumed that the valid CIDRs for a relay were the default CIDRs.
Relays wouldn't have worked for an organization with non-default
CIDRs.

Signed-off-by: Russell Bryant<EMAIL_ADDRESS>
commit 7c7385a7b16d4697f5b7b8f90ca7ce755a197751
Author: Russell Bryant<EMAIL_ADDRESS>Date:   Fri May 26 21:13:01 2023 -0400
nexd: Support choosing an organization

By default, nexd will pick the organization for you as long as the
user is only a member of a single organization. Otherwise, an
organization must be specified as a command line parameter or env var.

Closes #1082

Signed-off-by: Russell Bryant<EMAIL_ADDRESS>
commit c43f6d57137cdd1477e1d2625237ca9388333f05
Author: Russell Bryant<EMAIL_ADDRESS>Date:   Sat May 27 17:38:13 2023 -0400
e2e: Add TestChooseOrganization

Add an e2e test that validates that you can specify which organization
nexd should connect to.

Signed-off-by: Russell Bryant<EMAIL_ADDRESS>
commit 72b229ac2d87f95f6dd8bd0cb611f53a40030cb1
Author: Russell Bryant<EMAIL_ADDRESS>Date:   Sat May 27 17:45:11 2023 -0400
ui: Allow creating organizations

Turn on creating organizations through the UI.

Signed-off-by: Russell Bryant<EMAIL_ADDRESS>
commit 3bd996b57a932303b113079cc37cf8f10dec6f30
Author: Russell Bryant<EMAIL_ADDRESS>Date:   Sat May 27 18:19:13 2023 -0400
fflags: Enable multi-org support by default

Multi-org support has been behind a feature flag since it was not
fully implemented. Previous commits added UI support and nexd support,
so it seems fine to turn it on everywhere now. I left the feature flag
in place in case something goes wrong and we want to turn it back off.

Signed-off-by: Russell Bryant<EMAIL_ADDRESS>

I tested this manually so far. I created a 2nd org using nexctl.  Then:

I validated that nexd exits with an error if you don't specify an org. It also helpfully includes the org names and Ids in the log before exiting.
I validated that I can join either org and get an IP associated with that org.

@russellb Good PR, brings up an important topic.
Wondering if we should have a default flag on org default resources. We are getting into a similar conversation we had with a default zone vs. user specified zones. The cleanest UX is still giving the CLI options to nexd but we are heading down a broader path of loading up the CLI.
At the least, these are the big categories of optionality a user would be offered if an organization is scaled out to have an EC2 like experience.
sudo nexd \
--org-id 12345678-1234-1234-1234-123456789012  \
--vpc-id 9876543-1234-1234-1234-123456789012  \
--security-group<PHONE_NUMBER>-1234-1234-1234-123456789012  \
https://try.nexodus.io

A default column in the tables could be as simple as the first one created. The alternative is if someone experiments and creates a new resource, they are permanently locked out of the following user experience.
sudo nexd \
https://try.nexodus.io

Other thing worth considering is giving the option to use a name when calling the org. I know names aren't unique per se, but I think scopes would allow for non-overlapping org names globally unless the user explicitly specified an overlapping org that he/she owns.  It could be a check and a message back to the user to use the UUID if they overlap. Would also be for making names unique in an org based on the user scoping.
sudo nexd \
--org-id red  \
--vpc-id red-backend  \
--security-group red-airgap \
https://try.nexodus.io

Plenty of this is beyond the scope of this PR but the framework could be laid out by starting with orgs.

Thanks, @nerdalert !  Great topic.  My initial reaction:

I like the idea of having one as the default so --org-id (or similar) is never a hard requirement.
I wonder if the default should just be the user's personal org and skip exposing it as an option.
I also wonder if the user's default / personal org should be restricted to only the user and not allow invitations to others.
If we expand the hierarchy one more level (so networks are a construct inside of an org instead of the org itself), then inviting other users into a specific network seems OK.
A shorter point: a default to a network that will only ever have devices owned by the same user seems like a safe and reasonable default.

Agree
I think we need to expose all of them. The original use case in your PR where a user is a member of two orgs is very valid. A generic use case being a bunch of nodes that need administrative access by various team members, could be an org.
I would say make it shareable since the use cases is more enterprise focused than individual users with no relation. SaaS vs. Enterprise usage feels a bit at odds with each other on this one.
I think the easy answer is can I do this with EC2. Can I have an org with a bunch of VPCs and security groups that everyone in the org has access to? Also feels slightly orthogonal to the everyone gets an org approach but I much prefer an EC2 feel here. consumer vs. business environment.
I tend to think of an Org as a collection of users in practice. If a user has the rights to come into an org and consume the resources, they should likely be permitted to use any VPC in the org unless they are not in a permit list for that VPC. If a user stands this up for his environment, its not going to be 50 organizations for 50 users.

I feel like we really need to start exposing these knobs in a UI to start experimenting with different workflows. I definitely lean more towards the sharing of resources rather than the isolation due to how VPNs and Cloud resources are accessed and shared today.


Install Redis on Kallisto server

As Kallisto DeFi team, I want to have Redis installed on the Kallisto server, so I can store Kallisto performance/fee numbers for the Frontend to use and to have the history of past performance.
Acceptance Criteria

[ ] Redis is installed
[ ] Zhibai can start sending his output to Redis

server now running at redis.kallisto.finance


Endless loop of skipping recycling of Items.

I have an endless loop of skipping recycling of items followed by code such as
Skipping Recycling of Items. 59 space left in bag.
[14:27:37] Walking from () to () (70.2706450005 m)
[14:27:37] {'distance_unit': '', 'distance': '', 'current_position': (), 'last_position': ()}
[14:27:39] Skipping Recycling of Items. 59 space left in bag.
[14:27:39] {'distance_unit': '', 'distance': '', 'current_position': (), 'last_position': ()}

same issue :(

remove the "min_empty_space": 15, setting, it does only drop items when reaching the limit.
So you can close the bug.

It should be like this:
if self.min_empty_space is not None and free_bag_space >= self.min_empty_space and items_in_bag < total_bag_space:
            return

@doctordo0m that is not the solution.
That min_empty_space is a good thing to have to reduce the number of request it has to make, it's also more what a human would do

I was speking about his config....

Each loop will output that when the task if ran and it hasn't reached the threshold to drop items. That's the intended behaviour.

Thanks @DiegoRBaquero for the explanation and @doctordo0m for the help. Closing this issue.

This is not intended behavior but a bug, since the bot does nothing except print out that message continuously. Removing  "min_empty_space": 15 is a workaround but not a proper fix. Can you please look into the issue?
I noticed that when I added Max Revive to the list (possibly because of an increase in the # of items to keep) in my config.json, this issue can be reproduced.
My config.json currently contains the following, and I have not upgraded my items inventory.
      {
        "type": "RecycleItems",
        "config": {
          "min_empty_space": 15,
          "item_filter": {
            "Pokeball":       { "keep" : 10 },
            "Greatball":      { "keep" : 30 },
            "Ultraball":      { "keep" : 140 },
            "Potion":         { "keep" : 0 },
            "Super Potion":   { "keep" : 0 },
            "Hyper Potion":   { "keep" : 0 },
            "Max Potion":     { "keep" : 30 },
            "Revive":         { "keep" : 0 },
            "Max Revive":     { "keep" : 20 },
            "Razz Berry":     { "keep" : 30 }
          }
        }
      },

Looks like removing  "min_empty_space": 15, running, stopping and adding back  "min_empty_space": 15 fixes the issue. Seems to be a state bug.


Unreadable coverage report with typescript

I'm running the following command to try to get the coverage report of a typescript project
"test:coverage": "istanbul cover -e .ts -x '*.spec.ts' _mocha -- 'src/**/*.spec.ts' --compilers ts:ts-node/register",

It get some results

but when I in the report I see

Which makes no sense. Is it a bug ? Did I miss something ?

I'm currently using typescript and jenkins-mocha to successfully generate and view these reports.  I would check to see if there is a browser issue, or if you can replicate it consistently in a test repo.

Hi @avik-so,
I'm having the same issue. I've created a repo with test project. After installing app please run "npm run jest". After all, the coverage report will be created.
https://github.com/WojtekF/test-repo

I don't have tsx files in my project. Could that be the issue?

Well, that's weird. There is one tsx file there https://github.com/WojtekF/test-repo/blob/master/src/DispatchableButton.tsx

Hi @avik-so,
Can you tell me if there is any work ongoing regarding this issue? Did anyone looked into it? Can @thomasthiebaud and myself expect it to be fixed?

Sorry, no idea, I don't work on this project. I was just trying to help isolate the bug.

I have the same issue. 😢


Tagged Version

Thanks so much for your work on this module Andrew. I'm using it with success on one site and am about to integrate with another. One thing I'm worried about is having to put "dev-master" in my composer.json next to the package. Is there any chance you might tag a version?

+1

A tag was made on this but a new 3.4.0 tag with the current master branch would be handy.


aws example no longer works

Thanks for the great tool!
Running the example from the readme to retrieve the AWS data worked on July 5th, 2022 but didn't work on the next day (July 6th):
$ ffq --aws SRX7347523
[2022-07-06 12:15:44,487]    INFO Parsing Experiment SRX7347523
[2022-07-06 12:15:44,993] WARNING There is 1 run for SRX7347523
[2022-07-06 12:15:44,993]    INFO Parsing run SRR10668798
[]

I additionally tried on a number of other IDs but none worked

Same thing for google -- it seems like cloud links are no longer being fetched.

Annoyingly, it seems like NCBI has completely removed the links to fastq files from their databases and the run selectors so we are stuck with .sra files.

As it turns out, it seems like (based on numerous API requests) NCBI has started phasing out .sra files for many accessions. Since there are presumably some accessions for which the .sra file is still accessible we will keep the --ncbi option in the next release of ffq but will continue to monitor the situation to see if things change.


Using Redux-Actions with Redux-ORM

How do i use redux-actions with the redux-orm library ?
The createAction can be used to create action passing a payload .
How about the handleAction(s) or combineActions? I use the below syntax for reducers.

I'm also looking for answers to this.

Yeah... Currently puzzled about the exact same thing.

It should be straightforward - use the action types associated with the action creators in the logic (ie, replacing the case statements shown in that screenshot).


use jupyterlab instead of jupyter

this should fix it, tried installing locally and it worked, please review @klamann

Works, thanks @rauerhans! The good thing about using JupyterLab is that poetry run jupyter-lab works as well. I added that to the instructions.

Works, thanks @rauerhans! The good thing about using JupyterLab is that poetry run jupyter-lab works as well. I added that to the instructions.


Document de-facto usage of lowercased driver letters

Rust canonicalizes drive letters to the upper case, and that caused a hard-to-debug bug. In the ideal world, both servers and clients would do the actual canonicalization themselves, but I think it's a good idea to document status quo.

Hm, I wonder if VS Code side was actually fixed by https://code.visualstudio.com/updates/v1_46#_file-path-casing?

Actually https://code.visualstudio.com/updates/v1_46#_file-path-casing solves the problem of having two URLs with different casing pointing to the same file in case insensitive file systems.
But the overall problem still exists and it is actually not bound to the drive letter. I think instead of saying that the drive letter should be lower cases we should say something about the fact that a server can't assume that a file URI represents the file on disk in case of casing. So they need to do their own normalization if they for example use these URIs as keys in hashtables.

that a server can't assume that a file URI represents the file on disk in case of casing

You mean, both the server and the client? IIRC, our original problem was that VS Code didn't understand the URI we were sending back.

On systems that are case insensitive each component needs to assume that the file URI is represented in a different case then the one you already have for the file. Otherwise we would need to provide a central service to normalize them.
What changed in VS Code is that fact that if VS Code has a file under the URI file:///abc/text.txt and you now send it as file:///aBc/TeXt.txt then VS Code will detect that it is the same file on Windows and for example if you generate a diagnostic for it and click on it it will open the correct file only once.

Changed to a general note about being aware about the casing. I thought of requiring both the server and the client to be completely case-agnostic for case-insensitive systems, but that is awkward:

I think figuring out if a system is case-sensitive is actually pretty complicated (I think one can mount both case-sensitive and case-insensitive file systems at the same time, also the case tables themselves depend on a specific file systems).
I think in some cases it might makes sense to make some assumptions about the case? For example, I think it's reasonable to assume that DidOpenTextDocument and subsequent DidChangeTextDocument use the same URI, so that using a hash-map keyed by URI for the set of opened files should be allowed.


Update arc extension

Description

Hey folks,
I felt the need for the Arc commands such as new-window, new-tab, new-little-arc to have a spaces argument. The browser simply focuses onto the specified space before executing the main command.
As a validation step, the commands also now pulls the existing spaces from Arc and validates the given space title.
I feel like this could be an awesome addition to the command quicklinks where an user would like to open some link in a specific space rather than the one that's currently focused.
Screencast
Checklist

[x] I read the extension guidelines
[x] I read the documentation about publishing
[x] I ran npm run build and tested this distribution build in Raycast
[x] I checked that files in the assets folder are used by the extension itself
[x] I checked that assets used by the README are placed outside of the metadata folder

Closing this PR for the moment, found some bugs in the behaviour where a different browser window switches spaces and not the one intended.


Replace XMLHttpRequest by Fetch API

Currently, requests are sent through the XMLHttpRequest object.
Simplify and make the code more standard by using Fetch API.

It will break the compatibility because home made request and response objects will be replaced by the standard request and response.

Request Response and Fetch API are not supported on all browsers.
Some mobile browsers and Safari are not compatible.

Abandoned in favor of XHR :sad:


Change libtiff dependency to pylibtiff

This PR updates the package name for pearu/pylibtiff.
It seems the official PyPI project name for pearu/pylibtiff changed from libtiff to pylibtiff as of October 21, 2021.

We'll need to update the large_image_wheels to emit libtiff as pylibtiff before we merge this.

Drive-by comment that the conda-forge recipe should be good here (no changes needed): https://github.com/conda-forge/large-image-source-tiff-feedstock/blob/main/recipe/meta.yaml

Drive-by comment that the conda-forge recipe should be good here (no changes needed): https://github.com/conda-forge/large-image-source-tiff-feedstock/blob/main/recipe/meta.yaml

Awesome. I think after this PR you could drop the libtiff requirement there? Or is libtiff there referring to the actual libtiff library?

Or is libtiff there referring to the actual libtiff library?

Yes, libtiff is referring to the libtiff library while pylibtiff are the Python wrappings. That is still necessary in the conda recipe


unix: support SO_REUSEPORT with load balancing for UDP

UDP version of #4407

/cc @saghul @santigimeno

This CI failure should be fixed by #4417

Kindly ping @saghul @santigimeno

Merged the test update, can you pl rebase?

Merged the test update, can you pl rebase?

Done!

A test failure arose:
not ok 51 - fs_event_error_reporting
# exit code 6
# Output from process `fs_event_error_reporting`:
# Assertion failed in /Users/runner/work/libuv/libuv/test/test-fs-event.c on line 1115: `uv_loop_init(loop) == 0` (-24 == 0)

, which should have nothing to do with this PR (hopefully (⊙ˍ⊙))

Some comments on this? @saghul

It seems like an irrelevant CI failure:
not ok 321 - tcp_oob
# timeout
# Output from process `tcp_oob`: (no output)

Could you rerun the failed runner manually? @saghul

It seems like an irrelevant CI failure:
not ok 321 - tcp_oob
# timeout
# Output from process `tcp_oob`: (no output)

Could you rerun the failed runner manually? @saghul

Done.

Great! All checks have passed!
Can we get this PR merged now? @saghul

Ping @libuv/collaborators

@santigimeno Could you take a quick look at the latest code changes? Thanks!


Support for customizing return key

iOS has support for changing what the return/done key on the keybaord should be labeled with, see https://developer.apple.com/documentation/uikit/uireturnkeytype?language=objc.
We should expose this in Flutter. Currently, we only support UIReturnKeyDefault and UIReturnKeyDone, see [1]
We should also cross-check this with what android supports.
[1] https://github.com/flutter/engine/blob/7fa08b3ba94cb32cf0a2f466e5ee5d539d144705/shell/platform/darwin/ios/framework/Source/FlutterTextInputPlugin.mm#L32-L36

It would be great to have an inputAction field in the TextField widget. It's crucial for chat apps ("send"), search fields ("search") and complex forms ("next").
I stumbled upon this issue while porting a login form: The keyboard of the user name input should display a "next" button, which moves the focus to the password input.

Here is what Android supports:

IME_ACTION_DONE
IME_ACTION_GO
IME_ACTION_NEXT
IME_ACTION_SEARCH
IME_ACTION_SEND
IME_ACTION_NONE (newline)

https://developer.android.com/reference/android/view/inputmethod/EditorInfo
Right now the displayed action is bound to the keyboardType of the TextField.
In the Android engine, only a small change in the inputActionFromTextInputAction method is required to support additional actions.

@matthew-carroll You implemented this, right? Can we close it?

@goderbauer Yep, I think we're good here.  Interested parties can refer to the following PR:
https://github.com/flutter/flutter/pull/18855


Think about how to handle courts

Currently, courts is handled by the Weaver but it is not used at runtime by the AssemblyLine package. This leads to generating a broken interview if the template uses courts rather than trial_court

This is partially resolved in the AssemblyLine runtime package now, at least if ALMassachusetts is also installed. That is the right place to finish the fix.


Can I configure notPrincipals on istio-ingressgateway?

Hi everyone, I have a small question. I want to know if I can configure AuthorizationPolicy to restrict a certain port of istio-ingressgateway to only be accessed by a certain service. Like the following:
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
 name: istio-ingressgateway-ap
 namespace: istio-system
spec:
 selector:
   matchLabels:
     app: istio-ingressgateway
 action: DENY
 rules:
 - from:
   - source:
       notPrincipals: ["cluster.local/ns/default/sa/a-sa"]
   to:
   - operation:
       ports: ["7575"]

My expectation is that only a service under the default namespace can access port 7575 of istio-ingressgateway. But when I apply this configuration, I still get a permission error:
E1102 12:15:45.007566       ] rpc error: code = PermissionDenied desc = RBAC: access denied
E1102 12:15:55.019612       ] rpc error: code = PermissionDenied desc = RBAC: access denied
E1102 12:15:55.020170       ] rpc error: code = PermissionDenied desc = RBAC: access denied
E1102 12:16:05.011519       ] rpc error: code = PermissionDenied desc = RBAC: access denied
E1102 12:16:15.006897       ] rpc error: code = PermissionDenied desc = RBAC: access denied

My feeling is that istio-ingressgateway can't recognize notPrincipals , so it should not be able to access port 7575 at this time.
Is there anyone who knows about this? Hope to get your help.

How does your service access ingressgateway, could not be via istio mtls. So I guess this is because gateway can not get the principal of client

@hzxuzhonghu Thank you for your reply. I use the gateway accessed by ingressgateway IP:7575 because I have opened port 7575 on istio-ingressgateway. I also thought that ingressgateway could not recognize the principal of client.


Feature request: Set application name via connectionstring

void getApplicationName(SQLHDBC phdbc) gets the calling application name and uses that - i'd like to be able to specify the application via the connectionstring as can (seemingly) be done in jdbc. if this isn't done then it should fall back to what it does today. This is a normal practice with sql server and others.
good rationale:
https://www.connectionstrings.com/use-application-name-sql-server/

@mrtristan Thanks for reporting this issue and my apologies for the delay in response. I've notified our driver team so this can be investigated.

@mrtristan I need a little bit more information please. I can see ApplicationName is a valid connection string paramenter. I also see internal usage of void getApplicationName(SQLHDBC phdbc).
Do you require to be able to use a command line SELECT APP_NAME(); ?

@vahid110 realized i still had the 1.x version and it wasn't working in that context. targeted 2.x and it's working now. thanks.


Deploy on Hereoku

I am trying to deploy the splash docker image to Heroku but unfortunately, after starting the app is crashed on Heroku. I think It is targeted at deploying web apps, so likely it won't allow access to any port. Btw the image does work locally. I believe it is related to their runtime not being able to execute the entrypoint on the docker image but I could not find a solution

Btw I got a response from Heroku support. It was like:

I have checked your application logs and can see the following error which is leading your application to crash:

2020-05-06T16:50:25.781672+00:00 app[web.1]: 2020-05-06 16:50:25.780537 [-] FileNotFoundError: [Errno 2] No such file or directory: '/etc/splash/filters'
2020-05-06T16:50:25.806786+00:00 app[web.1]: The X11 connection broke: I/O error (code 1)
2020-05-06T16:50:25.806789+00:00 app[web.1]: XIO:  fatal IO error 22 (Invalid argument) on X server ":1321138268"
2020-05-06T16:50:25.806790+00:00 app[web.1]: after 495 requests (495 known processed) with 0 events remaining.
2020-05-06T16:50:25.926495+00:00 heroku[web.1]: State changed from starting to crashed
This seems to be an application code issue. Unfortunately, this appears to be an issue that falls outside the nature of the Heroku Support policy.

Encountering the same error. Were you able to find a solution for this?

unfortunately @jazminebarroga we could not find a solution on heroku and we could not get a response for a solution from the splash team :(


The  keymap for accepting suggestion fails to insert a tabulation when there is no suggestion available.

When the accept function is mapped to the <Tab> keymap, tabulation is not inserted when there is no suggestion available.
Unlike github/copilot.vim, copilot.nvim effectively inserts a tab even when there is no suggestion available.
The cause of this problem lies in the early void return statement found in all accept functions:
https://github.com/zbirenbaum/copilot.lua/blob/1a8032ae496916ccc7a7a52ee79194fbef29f462/lua/copilot/suggestion.lua#L444-L447
A potential solution to this issue, although it requires further testing to ensure there are no unintended side effects, could involve making the following code modification:
  if not suggestion or vim.fn.empty(suggestion.text) == 1 then
    local key = config.get("suggestion").keymap.accept
    key = vim.api.nvim_replace_termcodes(key, true, false, true)
    vim.fn.feedkeys(key, "n")
    return
  end

This is expected behavior. Check:

https://github.com/zbirenbaum/copilot.lua/discussions/153
https://github.com/zbirenbaum/copilot.lua/issues/160
https://github.com/zbirenbaum/copilot.lua/issues/91

Oh sorry did not see those threads


Internal Role assigned for a User via UserAdmin Admin Service Cannot be removed from the user via management console

Environment
IS 5.10.0 alpha3 snapshot
DB Mysql 5.7
Steps to Reproduce

In deployment.toml change the primary userstore to uniqueidjdbc userstore
[user_store]
type = "database_unique_id"
[user_store.properties]
SCIMEnabled= true

Add a user as kim2 for the primary user store created in step1

Add an Internal Role with addInternalRole Request as below.
Admin Service - https://localhost:9443/services/UserAdmin/

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://org.apache.axis2/xsd">
   <soapenv:Header/>
   <soapenv:Body>
      <xsd:addInternalRole>
         <!--Optional:-->
         <xsd:roleName>Internal/test4</xsd:roleName>
         <!--Zero or more repetitions:-->
         <xsd:userList>kim2</xsd:userList>
         <!--Zero or more repetitions:-->
         <xsd:permissions>/permission/admin</xsd:permissions>
      </xsd:addInternalRole>
   </soapenv:Body>
</soapenv:Envelope>

Login to the management console. There will be a Internal role created with name Internal/test4 and kim user will be assigned to this role
From management console try  to remove the assigned Inetrnal/test4 Role from the kim2 user.

Observation
It is unable to remove the Internal/test4 role from kim2 user from the management console.

This is happening since you have added role name with Internal prefix. This won't happen if you use role name as test4 only
 <xsd:roleName>Internal/test4</xsd:roleName>
https://github.com/wso2/carbon-identity-framework/pull/3175


Apex tests failures with error "Cannot read properties of undefined"

Describe the bug
Getting "Cannot read properties of undefined (reading 'testRunId')" during apex test runs
To Reproduce
Steps to reproduce the behavior:
sfpowerscripts apextests:trigger -l RunApexTestSuite --apextestsuite testsuite0 -u alias
Expected behavior
If there is test success or failure it should have thrown test results.
Screenshots

Platform Details (please complete the following information):

OS: linux
Version [e.g. CLI Version  eg: 1.6.6]
@flxbl-io/sfp/39.0.3 linux-x64 node-v18.17.1
Salesforce CLI(sfdx cli) Version:
CI Platform:

Additional context
Add any other context about the problem here.
this issue  comes and go on multiple builds but it is frequent and i have also tried with multip,e sf versions

@azlam-abdulsalam @nbatterham do u have any idea on this ?

@adarsha45  This is more of an erratic behaviour from salesforce, can you confirm there is no retry in between

hi @azlam-abdulsalam, thank you for looking into this.
Do you mean retry from salesforce side? and FYI we are facing multiple unknown issue similar to this i.e there is no test failure or success, but the execution stops just with unknow error.

@adarsha45  It seems the api is incorrectly getting rejected,  its something i am afraid we could not fix,  Whats the behaviour you see in your org, does the test seem to continue?

@azlam-abdulsalam, this issue is occurring on continuous basis now, almost on every build.

and yes the test also get failed in org , and as mentioned previously, test get passed in rerun


Scalar DB server sample

Cause the schema tool .jar file is removed so I re-create the PR.

Thank you. I'll fix it.

@thongdk8 Also, I deleted `` from xxx. It's nothing wrong with it but we don't use the format in our documents so I did it for consistency. (since consistency is important :))


Can't bond new LPT

I seemingly cannot bond new LPT.
I am bonded to a transcoder, but just send additional LPT to my address, and it doesn't show up in the Livepeer explorer on that address. The "CURRENT LIVEPEER TOKEN BALANCE" is basically not up to date when compared to Etherscan.
When I try to click on "bond to delegator", it also doesn't allow me to increase allowance (greyed out).

Hey @maxmersch. We've had some reports of stale data or caching issues in the explorer.
One thing to try is a hard refresh: CMND+SHIFT+R, and see if that updates your accurate balance? What browser are you using?
It's also worth mentioning if you urgently need to complete these actions they are possible through an interface like MyCrypto, but that's a little more technically involved.

@maxmersch Hmm, agreed definitely consistent with issues we've been seeing. I'd try verifying in a different browser - if there's still problems then and you're comfortable sending me your Ethereum address I can diagnose further.

So I switched over the Brave and that worked (was on Chrome before). Still shows up as the previous amount on Chrome now despite clearing history/cache.
Will check if it works for a 3rd round of LPT i plan to send to that address on Brave.
In either case - many thanks for the quick answers!


Possible Bug?

Facing this error when building XRay for B07L8QS5WD

An error occurred while building the X-Ray:
Invalid ConnectionString format for part "\XRAY.entities.B07L8QS5WD.asc", no equal sign found
at System.Data.SQLite.SQLiteConnection.ParseConnectionString(SQLiteConnection connection, String connectionString, Boolean allowNameOnly)
at System.Data.SQLite.SQLiteConnection.Open()
at XRayBuilder.Core.XRay.Logic.Export.XRayExporterSqlite.Create(String path) in C:\projects\xray-builder
-gui\XRayBuilder.Core\src\XRay\Logic\Export\XRayExporterSqlite.cs:line 52
at XRayBuilder.Core.XRay.Logic.Export.XRayExporterSqlite.Export(XRay xray, String path, IProgressBar progress, CancellationToken cancellationToken) in C:\projects\xray-builder-gui\XRayBuilder.Core\src\XRay\Logic\Export\XRayExporterSqlite.cs:line 29
at XRayBuilderGUI.UI.frmMain.btnBuild_Run() in C:\projects\xray-builder-gui\XRayBuilder\src\UI\frmMain.cs:line 226

asc files Auto Repair For Dummies®.zip

What's the path it's saving the files into?

What's the path it's saving the files into?

C:\Users\<6chars username>\Documents\Portable Apps\Xray\xray-builder-gui-v2.1.198\out\Deanna Sclar\Auto Repair For Dummies®

Seems to be related to the file path
Changed path to C:\Users\<username>\Documents\Portable Apps\Xray\xray-builder-gui-v2.1.198\out\Deanna Sclar\Auto Repair for Dummies\ and it worked successfully

Yeah it was probably the HTML-encoded trademark symbol ® that did it. I should be able to fix that when I get a chance.