Skip to content

Preserve linear_transform in Lattigo backend - #3315

Merged
copybara-service[bot] merged 1 commit into
mainfrom
test_960437546
Sep 2, 2026
Merged

Preserve linear_transform in Lattigo backend#3315
copybara-service[bot] merged 1 commit into
mainfrom
test_960437546

Conversation

@copybara-service

@copybara-service copybara-service Bot commented Aug 6, 2026

Copy link
Copy Markdown
Contributor

Preserve linear_transform in Lattigo backend

This change:

  • Implements the LWE-to-Lattigo lowering pattern for kernel.linear_transform to lattigo.ckks.linear_transform.
  • Enables has_kernel_linear_transform = 1 in Lattigo target config.
  • Fixes the Lattigo emitter to dynamically convert float32 diagonals to float64 in Go.
  • Resolves LevelQ and Scale matching issues in the emitter using dynamic ciphertext level instead of compile-time constants.
  • Aligns encoding slots with actual slot counts for CKKS bootstrapping.

After this change, the e2e lattigo tests using linalg.matvec lower to use the linear_transform op.

Still TODO is lowering a conv operator to an intermediate matvec op so it can be preserved as a linear_transform op, which is a bit of a larger change because it requires extracting the lowering for conv ops to occur before layout-propagation, and hard-coding the layout choice.

@j2kun

j2kun commented Aug 6, 2026

Copy link
Copy Markdown
Collaborator

Rebased over #3313. The new changes are the secret-to-ckks and scheme-to-backend conversion passes, as well as the e2e tests and enabling it in the lattigo config.

Interestingly: openfhe's linear_transform op is not part of their public API (and it only supports dense mode anyway, so it's less useful) so that backend is not enabled.

@j2kun
j2kun requested review from AlexanderViand and mdgrs August 6, 2026 23:11

@mdgrs mdgrs left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I mostly live in the CKKS world, but this has broken a BGV test:

tests/Examples/common/cmux.mlir:1:1

Comment thread lib/Dialect/Secret/Conversions/SecretToBGV/SecretToBGV.cpp
Comment thread lib/Dialect/Secret/Conversions/SecretToCKKS/SecretToCKKS.cpp Outdated
Comment thread lib/Dialect/LWE/Conversions/LWEToLattigo/LWEToLattigo.cpp
@copybara-service
copybara-service Bot force-pushed the test_960437546 branch 3 times, most recently from d55b94d to 8564c30 Compare August 13, 2026 20:32
@j2kun
j2kun requested a review from mdgrs August 13, 2026 20:34
Comment thread lib/Dialect/LWE/Conversions/LWEToLattigo/LWEToLattigo.cpp Outdated

@AlexanderViand AlexanderViand left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There seems to be a several places where a soft error (notifyMatchFailure) is used where I think hard emitOpError would be more appropriate/ give users clearer feedback. I annotated a few in LWEToLattigo's conversion pattern, but I think it also applies to the other patterns.

Comment thread lib/Dialect/LWE/Conversions/LWEToLattigo/LWEToLattigo.cpp Outdated
Comment thread lib/Dialect/LWE/Conversions/LWEToLattigo/LWEToLattigo.cpp Outdated
Comment thread lib/Dialect/LWE/Conversions/LWEToLattigo/LWEToLattigo.cpp
Comment thread lib/Dialect/LWE/Conversions/LWEToLattigo/LWEToLattigo.cpp
This change:
- Implements the LWE-to-Lattigo lowering pattern for kernel.linear_transform to lattigo.ckks.linear_transform.
- Enables has_kernel_linear_transform = 1 in Lattigo target config.
- Fixes the Lattigo emitter to dynamically convert float32 diagonals to float64 in Go.
- Resolves LevelQ and Scale matching issues in the emitter using dynamic ciphertext level instead of compile-time constants.
- Aligns encoding slots with actual slot counts for CKKS bootstrapping.

After this change, the e2e lattigo tests using linalg.matvec lower to use the linear_transform op.

Still TODO is lowering a conv operator to an intermediate matvec op so it can be preserved as a linear_transform op, which is a bit of a larger change because it requires extracting the lowering for conv ops to occur before layout-propagation, and hard-coding the layout choice.

PiperOrigin-RevId: 975385318
@copybara-service
copybara-service Bot merged commit cefe870 into main Sep 2, 2026
1 check passed
@copybara-service
copybara-service Bot deleted the test_960437546 branch September 2, 2026 23:16
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants