codon-model 0.0.3b2__tar.gz → 0.0.5__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (108) hide show
  1. {codon_model-0.0.3b2/codon_model.egg-info → codon_model-0.0.5}/PKG-INFO +1 -1
  2. {codon_model-0.0.3b2 → codon_model-0.0.5}/codon/__init__.py +1 -1
  3. {codon_model-0.0.3b2 → codon_model-0.0.5}/codon/base.py +102 -10
  4. {codon_model-0.0.3b2 → codon_model-0.0.5}/codon/block/__init__.py +14 -0
  5. {codon_model-0.0.3b2 → codon_model-0.0.5}/codon/block/attention.py +11 -6
  6. codon_model-0.0.5/codon/block/bio/__init__.py +9 -0
  7. {codon_model-0.0.3b2 → codon_model-0.0.5}/codon/block/embedding.py +3 -3
  8. codon_model-0.0.5/codon/block/fourier.py +106 -0
  9. {codon_model-0.0.3b2 → codon_model-0.0.5}/codon/block/lora.py +2 -0
  10. codon_model-0.0.3b2/codon/exp/block/manifold_conv.py → codon_model-0.0.5/codon/block/manifold.py +255 -134
  11. {codon_model-0.0.3b2 → codon_model-0.0.5}/codon/block/mlp.py +38 -0
  12. {codon_model-0.0.3b2 → codon_model-0.0.5}/codon/block/transformer.py +42 -13
  13. codon_model-0.0.5/codon/cli.py +48 -0
  14. codon_model-0.0.5/codon/dev/clear.py +41 -0
  15. codon_model-0.0.5/codon/dev/hash.py +54 -0
  16. codon_model-0.0.5/codon/exp/block/bio.py +494 -0
  17. codon_model-0.0.5/codon/exp/block/manifold.py +88 -0
  18. {codon_model-0.0.3b2 → codon_model-0.0.5}/codon/kit/train/__init__.py +3 -1
  19. codon_model-0.0.5/codon/kit/train/language.py +123 -0
  20. {codon_model-0.0.3b2 → codon_model-0.0.5}/codon/kit/train/vision.py +1 -1
  21. {codon_model-0.0.3b2/codon/model → codon_model-0.0.5/codon}/motif/base.py +4 -8
  22. codon_model-0.0.5/codon/motif/data/__init__.py +7 -0
  23. codon_model-0.0.5/codon/motif/data/prev1.py +87 -0
  24. codon_model-0.0.5/codon/motif/data/sft.py +161 -0
  25. {codon_model-0.0.3b2/codon/model → codon_model-0.0.5/codon}/motif/motif_a1.py +11 -14
  26. {codon_model-0.0.3b2/codon/model → codon_model-0.0.5/codon}/motif/motif_v1.py +2 -3
  27. {codon_model-0.0.3b2 → codon_model-0.0.5}/codon/ops/__init__.py +4 -0
  28. {codon_model-0.0.3b2 → codon_model-0.0.5}/codon/ops/attention.py +10 -17
  29. codon_model-0.0.5/codon/ops/fourier.py +33 -0
  30. codon_model-0.0.5/codon/ops/manifold/__init__.py +133 -0
  31. codon_model-0.0.5/codon/ops/manifold/conv.py +217 -0
  32. codon_model-0.0.3b2/codon/exp/ops/manifold_triton.py → codon_model-0.0.5/codon/ops/manifold/linear.py +6 -5
  33. {codon_model-0.0.3b2 → codon_model-0.0.5}/codon/ops/pixelshuffle.py +0 -1
  34. codon_model-0.0.5/codon/utils/data/__init__.py +29 -0
  35. codon_model-0.0.5/codon/utils/data/base.py +404 -0
  36. codon_model-0.0.5/codon/utils/data/chunked.py +192 -0
  37. codon_model-0.0.5/codon/utils/eval/__init__.py +24 -0
  38. codon_model-0.0.5/codon/utils/eval/activation.py +127 -0
  39. codon_model-0.0.5/codon/utils/eval/base.py +210 -0
  40. codon_model-0.0.5/codon/utils/eval/boundary.py +157 -0
  41. codon_model-0.0.5/codon/utils/eval/cka.py +191 -0
  42. codon_model-0.0.5/codon/utils/eval/confusion.py +77 -0
  43. codon_model-0.0.5/codon/utils/eval/gradcam.py +121 -0
  44. codon_model-0.0.5/codon/utils/eval/layer_rsa.py +130 -0
  45. codon_model-0.0.5/codon/utils/eval/rsa.py +103 -0
  46. codon_model-0.0.5/codon/utils/eval/selectivity.py +149 -0
  47. codon_model-0.0.5/codon/utils/eval/similarity.py +65 -0
  48. codon_model-0.0.5/codon/utils/eval/tsne.py +109 -0
  49. codon_model-0.0.5/codon/utils/generate.py +349 -0
  50. codon_model-0.0.5/codon/utils/info.py +137 -0
  51. codon_model-0.0.5/codon/utils/layer/__init__.py +0 -0
  52. codon_model-0.0.5/codon/utils/layer/lora.py +13 -0
  53. codon_model-0.0.5/codon/utils/layer/manifold.py +70 -0
  54. codon_model-0.0.5/codon/utils/lifecycle.py +56 -0
  55. codon_model-0.0.5/codon/utils/plan.py +314 -0
  56. {codon_model-0.0.3b2 → codon_model-0.0.5}/codon/utils/seed.py +8 -4
  57. codon_model-0.0.5/codon/utils/session.py +323 -0
  58. codon_model-0.0.3b2/codon/utils/token.py → codon_model-0.0.5/codon/utils/tokens.py +110 -27
  59. {codon_model-0.0.3b2 → codon_model-0.0.5}/codon/utils/transforms.py +13 -6
  60. {codon_model-0.0.3b2 → codon_model-0.0.5/codon_model.egg-info}/PKG-INFO +1 -1
  61. codon_model-0.0.5/codon_model.egg-info/SOURCES.txt +96 -0
  62. codon_model-0.0.5/codon_model.egg-info/entry_points.txt +2 -0
  63. {codon_model-0.0.3b2 → codon_model-0.0.5}/setup.py +5 -0
  64. {codon_model-0.0.3b2 → codon_model-0.0.5}/test/test_motifv1_train.py +1 -1
  65. codon_model-0.0.3b2/codon/exp/block/manifold.py +0 -332
  66. codon_model-0.0.3b2/codon/exp/ops/manifold.py +0 -63
  67. codon_model-0.0.3b2/codon/utils/dataset/__init__.py +0 -22
  68. codon_model-0.0.3b2/codon/utils/dataset/base.py +0 -124
  69. codon_model-0.0.3b2/codon/utils/dataset/conflux/base.py +0 -316
  70. codon_model-0.0.3b2/codon/utils/dataset/conflux/reader.py +0 -239
  71. codon_model-0.0.3b2/codon/utils/dataset/conflux/writer.py +0 -229
  72. codon_model-0.0.3b2/codon/utils/dataset/corpus.py +0 -630
  73. codon_model-0.0.3b2/codon_model.egg-info/SOURCES.txt +0 -67
  74. codon_model-0.0.3b2/test/test_conflux_dataset.py +0 -113
  75. {codon_model-0.0.3b2 → codon_model-0.0.5}/LICENSE +0 -0
  76. {codon_model-0.0.3b2 → codon_model-0.0.5}/codon/block/bio/hebian.py +0 -0
  77. {codon_model-0.0.3b2 → codon_model-0.0.5}/codon/block/bio/predictive.py +0 -0
  78. {codon_model-0.0.3b2 → codon_model-0.0.5}/codon/block/codebook.py +0 -0
  79. {codon_model-0.0.3b2 → codon_model-0.0.5}/codon/block/conv.py +0 -0
  80. {codon_model-0.0.3b2 → codon_model-0.0.5}/codon/block/film.py +0 -0
  81. {codon_model-0.0.3b2 → codon_model-0.0.5}/codon/block/fusion.py +0 -0
  82. {codon_model-0.0.3b2 → codon_model-0.0.5}/codon/block/moe.py +0 -0
  83. {codon_model-0.0.3b2 → codon_model-0.0.5}/codon/block/pixelshuffle.py +0 -0
  84. {codon_model-0.0.3b2/codon/block/bio → codon_model-0.0.5/codon/dev}/__init__.py +0 -0
  85. {codon_model-0.0.3b2 → codon_model-0.0.5}/codon/exp/__init__.py +0 -0
  86. {codon_model-0.0.3b2 → codon_model-0.0.5}/codon/exp/block/__init__.py +0 -0
  87. {codon_model-0.0.3b2 → codon_model-0.0.5}/codon/exp/block/moe.py +0 -0
  88. {codon_model-0.0.3b2 → codon_model-0.0.5}/codon/exp/ops/__init__.py +0 -0
  89. {codon_model-0.0.3b2 → codon_model-0.0.5}/codon/kit/__init__.py +0 -0
  90. {codon_model-0.0.3b2 → codon_model-0.0.5}/codon/model/__init__.py +0 -0
  91. {codon_model-0.0.3b2 → codon_model-0.0.5}/codon/model/patch_disc.py +0 -0
  92. {codon_model-0.0.3b2 → codon_model-0.0.5}/codon/model/resnet.py +0 -0
  93. {codon_model-0.0.3b2 → codon_model-0.0.5}/codon/model/tcn.py +0 -0
  94. {codon_model-0.0.3b2/codon/model → codon_model-0.0.5/codon}/motif/__init__.py +0 -0
  95. /codon_model-0.0.3b2/codon/utils/__init__.py → /codon_model-0.0.5/codon/motif/motif_a2.py +0 -0
  96. {codon_model-0.0.3b2 → codon_model-0.0.5}/codon/ops/bio.py +0 -0
  97. {codon_model-0.0.3b2/codon/utils/dataset/conflux → codon_model-0.0.5/codon/utils}/__init__.py +0 -0
  98. {codon_model-0.0.3b2/codon/utils/dataset → codon_model-0.0.5/codon/utils/data}/dataviewer.py +0 -0
  99. {codon_model-0.0.3b2/codon/utils/dataset → codon_model-0.0.5/codon/utils/data}/flatdata.py +0 -0
  100. {codon_model-0.0.3b2/codon/utils/dataset → codon_model-0.0.5/codon/utils/data}/image.py +0 -0
  101. {codon_model-0.0.3b2 → codon_model-0.0.5}/codon/utils/mask.py +0 -0
  102. {codon_model-0.0.3b2 → codon_model-0.0.5}/codon/utils/safecode.py +0 -0
  103. {codon_model-0.0.3b2 → codon_model-0.0.5}/codon/utils/split.py +0 -0
  104. {codon_model-0.0.3b2 → codon_model-0.0.5}/codon/utils/theta.py +0 -0
  105. {codon_model-0.0.3b2 → codon_model-0.0.5}/codon_model.egg-info/dependency_links.txt +0 -0
  106. {codon_model-0.0.3b2 → codon_model-0.0.5}/codon_model.egg-info/requires.txt +0 -0
  107. {codon_model-0.0.3b2 → codon_model-0.0.5}/codon_model.egg-info/top_level.txt +0 -0
  108. {codon_model-0.0.3b2 → codon_model-0.0.5}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: codon-model
3
- Version: 0.0.3b2
3
+ Version: 0.0.5
4
4
  Summary: Codon model package
5
5
  Author: CodonTeam
6
6
  Requires-Python: >=3.8
@@ -1,5 +1,5 @@
1
1
  from typing import Optional
2
2
 
3
- __version__ = '0.0.3b2'
3
+ __version__ = '0.0.5'
4
4
 
5
5
  __seed__: Optional[int] = None
@@ -1,9 +1,11 @@
1
1
  import torch
2
2
  import torch.nn as nn
3
+ import torch.nn.functional as F
3
4
 
4
5
  from typing import Callable, Any, Iterator, Union
5
6
 
6
7
  from safetensors.torch import save_model as safe_save_model
8
+ from safetensors.torch import save_file as safe_save_file
7
9
  from safetensors.torch import load_model as safe_load_model
8
10
 
9
11
 
@@ -132,36 +134,126 @@ class BasicModel(nn.Module):
132
134
 
133
135
  return total
134
136
 
135
- def load_pretrained(self, path: str) -> None:
137
+ def load_pretrained(self, path: str, strict: bool = False) -> 'BasicModel':
136
138
  '''
137
139
  Load a pretrained model from a file.
138
-
139
140
  Args:
140
141
  path (str): The path to the model file.
142
+ strict (bool, optional): Whether to strictly enforce that the keys
143
+ in state_dict match. Defaults to False.
141
144
  '''
142
145
  if path.endswith('.safetensors'):
143
- safe_load_model(self, path)
144
- return
145
-
146
+ safe_load_model(self, path, strict=strict)
147
+ return self
146
148
  state_dict = torch.load(path, map_location=self.device)
147
-
148
149
  if isinstance(state_dict, dict):
149
150
  if 'model_state_dict' in state_dict:
150
151
  state_dict = state_dict['model_state_dict']
151
152
  elif 'state_dict' in state_dict:
152
153
  state_dict = state_dict['state_dict']
154
+ elif 'model' in state_dict:
155
+ state_dict = state_dict['model']
153
156
 
154
- self.load_state_dict(state_dict)
157
+ clean_state_dict = {k.replace('_orig_mod.', ''): v for k, v in state_dict.items()}
158
+
159
+ self.load_state_dict(clean_state_dict, strict=strict)
160
+ return self
155
161
 
156
- def save_pretrained(self, path: str) -> None:
162
+ def save_pretrained(
163
+ self,
164
+ path: str,
165
+ trainable_only: bool = False,
166
+ include_buffer: bool = True,
167
+ exclude_modules: list[Union[type, nn.Module]] = None,
168
+ only: list[str] = None,
169
+ exclude: list[str] = None
170
+ ) -> 'BasicModel':
157
171
  '''
158
172
  Save the model to a file.
159
173
 
160
174
  Args:
161
175
  path (str): The path to save the model file.
176
+ trainable_only (bool, optional): If True, only save parameters that require gradients.
177
+ include_buffer (bool, optional): If False, exclude registered buffers from the saved file.
178
+ exclude_modules (list[Union[type, nn.Module]], optional): Module types or instances to exclude.
179
+ only (list[str], optional): If provided, only save parameters whose keys contain ANY of these strings.
180
+ exclude (list[str], optional): If provided, exclude parameters whose keys contain ANY of these strings.
162
181
  '''
182
+ state_dict = self.state_dict()
183
+ is_modified = False
184
+
185
+ exclude_prefixes = []
186
+ if exclude_modules:
187
+ exclude_types = tuple(t for t in exclude_modules if isinstance(t, type))
188
+ exclude_instances = set(m for m in exclude_modules if not isinstance(m, type))
189
+
190
+ for name, module in self.named_modules():
191
+ if module in exclude_instances or (exclude_types and isinstance(module, exclude_types)):
192
+ if name != '': exclude_prefixes.append(name + '.')
193
+ exclude_prefixes = tuple(exclude_prefixes)
194
+
195
+ has_filter = trainable_only or not include_buffer or exclude_prefixes or only or exclude
196
+
197
+ if has_filter:
198
+ trainable_names = {name for name, p in self.named_parameters() if p.requires_grad}
199
+ buffer_names = {name for name, _ in self.named_buffers()}
200
+
201
+ filtered_dict = {}
202
+ for key, tensor in state_dict.items():
203
+ keep = True
204
+
205
+ if exclude_prefixes and key.startswith(exclude_prefixes):
206
+ keep = False
207
+
208
+ elif exclude and any(kw in key for kw in exclude):
209
+ keep = False
210
+
211
+ elif only and not any(kw in key for kw in only):
212
+ keep = False
213
+
214
+ else:
215
+ is_buffer = key in buffer_names
216
+ if not include_buffer and is_buffer:
217
+ keep = False
218
+ elif trainable_only and not is_buffer and key not in trainable_names:
219
+ keep = False
220
+
221
+ if keep:
222
+ filtered_dict[key] = tensor
223
+ else:
224
+ is_modified = True
225
+
226
+ if is_modified:
227
+ state_dict = filtered_dict
228
+
163
229
  if path.endswith('.safetensors'):
164
- safe_save_model(self, path)
230
+ if not is_modified:
231
+ safe_save_model(self, path)
232
+ else:
233
+ safe_save_file(state_dict, path)
165
234
  else:
166
- state_dict = self.state_dict()
167
235
  torch.save(state_dict, path)
236
+
237
+ return self
238
+
239
+ def freeze(self) -> 'BasicModel':
240
+ '''
241
+ Freeze all parameters in the model by setting requires_grad to False.
242
+
243
+ Returns:
244
+ BasicModel: The model itself for method chaining.
245
+ '''
246
+ for param in self.parameters():
247
+ param.requires_grad = False
248
+ return self
249
+
250
+ def unfreeze(self) -> 'BasicModel':
251
+ '''
252
+ Unfreeze all parameters in the model by setting requires_grad to True.
253
+
254
+ Returns:
255
+ BasicModel: The model itself for method chaining.
256
+ '''
257
+ for param in self.parameters():
258
+ param.requires_grad = True
259
+ return self
@@ -31,6 +31,12 @@ from .transformer import (
31
31
  TransformerMoEDecoder,
32
32
  _TransformerDecoder,
33
33
  )
34
+ from .manifold import (
35
+ MainfoldLoss,
36
+ BasicManifoldLinear, RiemannianManifoldLinear,
37
+ BasicManifoldConv2d, RiemannianManifoldConv2d
38
+ )
39
+ from .fourier import MultiHeadFourier
34
40
 
35
41
  __all__ = [
36
42
  # attention
@@ -80,4 +86,12 @@ __all__ = [
80
86
  'TransformerDecoderOutput',
81
87
  'TransformerDenseDecoder',
82
88
  'TransformerMoEDecoder',
89
+ # manifold
90
+ 'MainfoldLoss',
91
+ 'BasicManifoldLinear',
92
+ 'RiemannianManifoldLinear',
93
+ 'BasicManifoldConv2d',
94
+ 'RiemannianManifoldConv2d',
95
+ # Fourier
96
+ 'MultiHeadFourier',
83
97
  ]
@@ -1,6 +1,9 @@
1
1
  from codon.base import *
2
2
  from codon.block.embedding import BasicEmbedding
3
- from codon.ops.attention import AttentionOutput, apply_attention
3
+ from codon.ops.attention import (
4
+ AttentionOutput,
5
+ apply_attention
6
+ )
4
7
 
5
8
 
6
9
  class MultiHeadAttention(BasicModel):
@@ -25,6 +28,7 @@ class MultiHeadAttention(BasicModel):
25
28
  use_qk_norm=True,
26
29
  use_gate=False,
27
30
  dropout=0.1,
31
+ bias: bool=True,
28
32
  is_causal=True
29
33
  ):
30
34
  '''
@@ -65,12 +69,12 @@ class MultiHeadAttention(BasicModel):
65
69
  self.k_norm = nn.RMSNorm(self.head_dim)
66
70
 
67
71
  if use_gate:
68
- self.g_proj = nn.Linear(hidden_size, hidden_size)
72
+ self.g_proj = nn.Linear(hidden_size, hidden_size, bias=bias)
69
73
 
70
- self.q_proj = nn.Linear(hidden_size, hidden_size)
71
- self.k_proj = nn.Linear(hidden_size, self.kv_dim)
72
- self.v_proj = nn.Linear(hidden_size, self.kv_dim)
73
- self.o_proj = nn.Linear(hidden_size, hidden_size)
74
+ self.q_proj = nn.Linear(hidden_size, hidden_size, bias=bias)
75
+ self.k_proj = nn.Linear(hidden_size, self.kv_dim, bias=bias)
76
+ self.v_proj = nn.Linear(hidden_size, self.kv_dim, bias=bias)
77
+ self.o_proj = nn.Linear(hidden_size, hidden_size, bias=bias)
74
78
 
75
79
  def forward(
76
80
  self,
@@ -171,3 +175,4 @@ class MultiHeadAttention(BasicModel):
171
175
  attention_weights=attention_weights,
172
176
  past_key_value=current_key_value
173
177
  )
178
+
@@ -0,0 +1,9 @@
1
+ from .hebian import HebianOutput, Hebian
2
+ from .predictive import PredictiveCodingOutput, PredictiveCoding
3
+
4
+ __all__ = [
5
+ 'HebianOutput',
6
+ 'Hebian',
7
+ 'PredictiveCodingOutput',
8
+ 'PredictiveCoding'
9
+ ]
@@ -69,7 +69,7 @@ class SinusoidalEmbedding(BasicEmbedding):
69
69
  pe[:, 1::2] = torch.cos(position * div_term)
70
70
 
71
71
  pe = pe.unsqueeze(0)
72
- self.register_buffer('pe', pe)
72
+ self.register_buffer('pe', pe, persistent=False)
73
73
 
74
74
  def forward(self, x: torch.Tensor, positions: torch.Tensor = None, start_pos: int = 0) -> torch.Tensor:
75
75
  '''
@@ -132,8 +132,8 @@ class BasicRotaryEmbedding(BasicEmbedding):
132
132
 
133
133
  emb = torch.cat((freqs, freqs), dim=-1)
134
134
 
135
- self.register_buffer('cos_cached', emb.cos())
136
- self.register_buffer('sin_cached', emb.sin())
135
+ self.register_buffer('cos_cached', emb.cos(), persistent=False)
136
+ self.register_buffer('sin_cached', emb.sin(), persistent=False)
137
137
 
138
138
  def _rotate_half(self, x: torch.Tensor) -> torch.Tensor:
139
139
  '''
@@ -0,0 +1,106 @@
1
+ import torch
2
+ import torch.nn as nn
3
+ import torch.nn.functional as F
4
+
5
+ from codon.base import BasicModel
6
+ from codon.ops.attention import AttentionOutput
7
+ from codon.ops.fourier import apply_fourier_mixing
8
+
9
+
10
+ class MultiHeadFourier(BasicModel):
11
+ '''
12
+ Multi-Head Fourier (MHF) module from 'Caracal: Causal Architecture via Spectral Mixing'.
13
+ Replaces dense Attention with O(L log L) frequency-domain mixing.
14
+ '''
15
+ def __init__(
16
+ self,
17
+ hidden_size: int,
18
+ num_heads: int,
19
+ **kwargs
20
+ ):
21
+ super().__init__()
22
+
23
+ assert hidden_size % num_heads == 0, 'hidden_size must be divisible by num_heads'
24
+
25
+ self.d_model = hidden_size
26
+ self.n_heads = num_heads
27
+ self.d_head = hidden_size // num_heads
28
+
29
+ self.pre_conv = nn.Conv1d(
30
+ in_channels=self.d_model,
31
+ out_channels=self.d_model,
32
+ kernel_size=3,
33
+ groups=self.d_model,
34
+ bias=False
35
+ )
36
+ self.ln = nn.LayerNorm(self.d_model)
37
+ self.silu = nn.SiLU()
38
+
39
+ self.W_V = nn.Linear(self.d_model, self.d_model)
40
+ self.W_G1 = nn.Linear(self.d_model, self.d_model)
41
+ self.W_G2 = nn.Conv1d(
42
+ in_channels=self.d_model,
43
+ out_channels=self.d_model,
44
+ kernel_size=1,
45
+ groups=self.n_heads
46
+ )
47
+
48
+ self.linear = nn.Linear(self.d_model, self.d_model)
49
+ self.linear.NEED_SCALE_INIT = 1
50
+
51
+ def forward(
52
+ self,
53
+ hidden_states: torch.Tensor,
54
+ use_cache: bool = False,
55
+ past_key_value: tuple = None,
56
+ **kwargs
57
+ ) -> AttentionOutput:
58
+
59
+ batch_size, seq_len, _ = hidden_states.size()
60
+
61
+ x_permuted = hidden_states.permute(0, 2, 1) # [B, D, L]
62
+
63
+ if past_key_value is not None:
64
+ conv_state, v_cache, g_cache = past_key_value
65
+ x_padded = torch.cat([conv_state, x_permuted], dim=2)
66
+ x = self.pre_conv(x_padded).permute(0, 2, 1) # [B, 1, D]
67
+
68
+ new_conv_state = x_padded[:, :, 1:]
69
+ else:
70
+ padding = self.pre_conv.kernel_size[0] - 1
71
+ x_padded = F.pad(x_permuted, (padding, 0))
72
+ x = self.pre_conv(x_padded).permute(0, 2, 1) # [B, L, D]
73
+
74
+ new_conv_state = x_padded[:, :, -padding:] if use_cache else None
75
+
76
+ x_norm = self.ln(x)
77
+
78
+ x_v = self.W_V(x_norm).reshape(batch_size, seq_len, self.n_heads, self.d_head).transpose(1, 2)
79
+
80
+ x_g = self.W_G1(x_norm).transpose(1, 2)
81
+ x_g = self.W_G2(self.silu(x_g)).transpose(1, 2)
82
+ x_g = x_g.reshape(batch_size, seq_len, self.n_heads, self.d_head).transpose(1, 2)
83
+
84
+ if past_key_value is not None:
85
+ new_v_cache = torch.cat([v_cache, x_v], dim=2)
86
+ new_g_cache = torch.cat([g_cache, x_g], dim=2)
87
+
88
+ g_flipped = torch.flip(new_g_cache, dims=[2])
89
+
90
+ x_mixed = torch.sum(new_v_cache * g_flipped, dim=2, keepdim=True)
91
+ else:
92
+ x_mixed = apply_fourier_mixing(x_v, x_g, seq_len)
93
+
94
+ new_v_cache = x_v if use_cache else None
95
+ new_g_cache = x_g if use_cache else None
96
+
97
+ x_mixed = x_mixed.transpose(1, 2).contiguous().reshape(batch_size, seq_len, self.d_model)
98
+ output = self.linear(x_mixed)
99
+
100
+ current_key_value = (new_conv_state, new_v_cache, new_g_cache) if use_cache else None
101
+
102
+ return AttentionOutput(
103
+ output=output,
104
+ attention_weights=None,
105
+ past_key_value=current_key_value
106
+ )
@@ -50,6 +50,8 @@ class BasicLoRA(BasicModel):
50
50
  super().__init__()
51
51
  self.gradient_checkpointing = gradient_checkpointing
52
52
  self.original_layer = original_layer
53
+ self.lora_dropout_p = lora_dropout
54
+ self.merge_weights = merge_weights
53
55
 
54
56
  # Freeze original layer
55
57
  for p in self.original_layer.parameters():