File size: 37,296 Bytes
178a831
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
---
tags:
- sentence-transformers
- sentence-similarity
- feature-extraction
- dense
- generated_from_trainer
- dataset_size:15565
- loss:MultipleNegativesRankingLoss
base_model: google/embeddinggemma-300m
widget:
- source_sentence: I need to lock an object in my model so I can work on other parts
    without accidentally selecting it. How can I do that?
  sentences:
  - You cannot use the following methods IsObjectLocked, LockObjects, UnlockObject,
    SelectObject, SelectObjects, UnlockObjects, IsObjectSelectable, ShowObject, IsObjectNormal
  - object
  - "You can use the following methods to complete the task.\nmethod: LockObject\n\
    description: Locks a single object. Locked objects are visible, and they can be\r\
    \n    snapped to. But, they cannot be selected.\nsyntax: LockObject(object_id)\n\
    parameters: object_id (guid): The identifier of an object\nreturns: bool: True\
    \ or False indicating success or failure\n\nFollowing is the code that uses this\
    \ method to complete the task as per user query.\n\n```python\nimport rhinoscriptsyntax\
    \ as rs\n\n# Lock an object in the model to prevent accidental selection\nid =\
    \ rs.GetObject(\"Select object to lock\")\nif id:\n    rs.LockObject(id)\n   \
    \ print(\"Object locked successfully.\")\nelse:\n    print(\"No object selected.\"\
    )\n```"
- source_sentence: I want to create a cloud of points in my Rhino model. Can you show
    me how to do that?
  sentences:
  - "You can use the following methods to complete the task.\nmethod: AddPointCloud\n\
    description: Adds point cloud object to the document\nsyntax: AddPointCloud(points,\
    \ colors=None)\nparameters: \npoints ([point, ....]): list of values where every\
    \ multiple of three represents a point\r\ncolors ([color, ...]): list of colors\
    \ to apply to each point\n\nreturns: \nguid: identifier of point cloud on success\n\
    \n\nFollowing is the code that uses this method to complete the task as per user\
    \ query.\n\n```python\nimport rhinoscriptsyntax as rs\n\n# Create a cloud of points\
    \ in Rhino\npoints = [(0, 0, 0), (1, 1, 1), (2, 2, 2), (3, 3, 3)]  # Define points\n\
    rs.AddPointCloud(points)  # Add the point cloud to the model\n```"
  - geometry
  - You cannot use the following methods PointCloudPoints, AddPoints, CreatePoint,
    PointCloudCount, AddPoint, AddLine, PointCloudHidePoints, CreateVector, PointCoordinates
- source_sentence: I need to find out which vertices make up each face of my mesh.
    Can you help me with that?
  sentences:
  - "You can use the following methods to complete the task.\nmethod: MeshFaces\n\
    description: Returns face vertices of a mesh\nsyntax: MeshFaces(object_id, face_type=True)\n\
    parameters: object_id (guid): identifier of a mesh object\nface_type (bool, optional):\
    \ The face type to be returned. True = both triangles and quads. False = only\
    \ triangles\nreturns: list([point, point, point, point], ...): 3D points that\
    \ define the face vertices of the mesh. If face_type is True, then faces are returned\
    \ as both quads and triangles (4 3D points). For triangles, the third and fourth\
    \ vertex will be identical. If face_type is False, then faces are returned as\
    \ only triangles(3 3D points). Quads will be converted to triangles.\n\nFollowing\
    \ is the code that uses this method to complete the task as per user query.\n\n\
    ```python\nimport rhinoscriptsyntax as rs\n# Get the mesh object from the user\n\
    obj = rs.GetObject(\"Select mesh\", rs.filter.mesh)\n# Retrieve the vertex indices\
    \ for each face of the mesh\nfaces = rs.MeshFaces(obj, True)\nif faces:\n    rs.EnableRedraw(False)\n\
    \    i = 0\n    while i < len(faces):\n        # Each face can be a triangle or\
    \ a quad\n        face = faces[i:i+4] if len(faces) > i + 3 else faces[i:i+3]\n\
    \        print(\"Face vertices:\", face)\n        i += 3 if len(face) == 3 else\
    \ 4\n    rs.EnableRedraw(True)\n```"
  - You cannot use the following methods MeshVertexFaces, MeshFaceVertices, MeshVertices,
    MeshVertexCount, MeshFaceCenters, MeshTriangleCount, MeshQuadCount, MeshFaceCount,
    MeshNakedEdgePoints
  - mesh
- source_sentence: Can you show me how to check if two transformation matrices are
    the same in Rhino?
  sentences:
  - "You can use the following methods to complete the task.\nmethod: XformChangeBasis2\n\
    description: Returns a change of basis transformation matrix of None on error\n\
    syntax: XformChangeBasis2(x0,y0,z0,x1,y1,z1)\nparameters: \nx0,y0,z0 (vector):\
    \ initial basis\r\nx1,y1,z1 (vector): final basis\n\nreturns: \ntransform: The\
    \ 4x4 transformation matrix if successful\r\nNone: if not successful\n\n\nFollowing\
    \ is the code that uses this method to complete the task as per user query.\n\n\
    ```python\nimport rhinoscriptsyntax as rs\n\n# Function to check if two transformation\
    \ matrices are the same\n# Parameters: mat1, mat2 - transformation matrices to\
    \ compare\n# Returns: True if they are the same, False otherwise\ndef are_matrices_equal(mat1,\
    \ mat2):\n    return rs.XformCompare(mat1, mat2) == 0\n\n# Example usage\nmatrix1\
    \ = rs.XformChangeBasis2(1, 0, 0, 0, 1, 0)\nmatrix2 = rs.XformChangeBasis2(1,\
    \ 0, 0, 0, 1, 0)\nresult = are_matrices_equal(matrix1, matrix2)\nprint(\"Matrices\
    \ are equal:\" , result)\n```"
  - You cannot use the following methods XformCompare, IsXformSimilarity, IsXformIdentity,
    IsXformZero, CompareGeometry, CreateXform, VectorTransform, XformTranslation,
    TransformObject, XformDeterminant
  - transformation
- source_sentence: I need to find where a flat surface meets a sphere. How can I do
    that in Rhino?
  sentences:
  - plane
  - You cannot use the following methods LineSphereIntersection, IsSphere, AddSphere,
    LinePlaneIntersection, Angle, CircleCenterPoint, CurveCurveIntersection, CurveSurfaceIntersection,
    AddCircle3Pt
  - "You can use the following methods to complete the task.\nmethod: PlaneSphereIntersection\n\
    description: Calculates the intersection of a plane and a sphere.\nsyntax: PlaneSphereIntersection(plane,\
    \ sphere_plane, sphere_radius)\nparameters: plane (plane): The plane to intersect;\
    \ sphere_plane (plane): Equatorial plane of the sphere (origin is center); sphere_radius\
    \ (float): Radius of the sphere.\nreturns: list: [type, point/plane, radius] where\
    \ type=0 for point, 1 for circle. None on error.\n\nFollowing is the code that\
    \ uses this method to complete the task as per user query.\n\n```python\nimport\
    \ rhinoscriptsyntax as rs\n\n# Define a flat surface as a plane\nplane = rs.WorldXYPlane()\n\
    # Define the radius of the sphere\nradius = 10\n# Calculate the intersection between\
    \ the plane and the sphere\nresults = rs.PlaneSphereIntersection(plane, plane,\
    \ radius)\n\n# Check if there are results and handle them accordingly\nif results:\n\
    \    if results[0] == 0:\n        # If the intersection is a point, add it to\
    \ the document\n        rs.AddPoint(results[1])\n    else:\n        # If the intersection\
    \ is a circle, add it to the document\n        rs.AddCircle(results[1], results[2])\n\
    ```"
datasets:
- deebak14/embedding_tuple_data_v1
- deebak14/embedding_triplet_data_v1
pipeline_tag: sentence-similarity
library_name: sentence-transformers
metrics:
- cosine_accuracy
model-index:
- name: SentenceTransformer based on google/embeddinggemma-300m
  results:
  - task:
      type: triplet
      name: Triplet
    dataset:
      name: base eval
      type: base-eval
    metrics:
    - type: cosine_accuracy
      value: 1.0
      name: Cosine Accuracy
---

# SentenceTransformer based on google/embeddinggemma-300m

This is a [sentence-transformers](https://www.SBERT.net) model finetuned from [google/embeddinggemma-300m](https://huggingface.co/google/embeddinggemma-300m) on the [embedding_tuple_data_v1](https://huggingface.co/datasets/deebak14/embedding_tuple_data_v1) dataset. It maps sentences & paragraphs to a 768-dimensional dense vector space and can be used for semantic textual similarity, semantic search, paraphrase mining, text classification, clustering, and more.

## Model Details

### Model Description
- **Model Type:** Sentence Transformer
- **Base model:** [google/embeddinggemma-300m](https://huggingface.co/google/embeddinggemma-300m) <!-- at revision 57c266a740f537b4dc058e1b0cda161fd15afa75 -->
- **Maximum Sequence Length:** 2048 tokens
- **Output Dimensionality:** 768 dimensions
- **Similarity Function:** Cosine Similarity
- **Training Dataset:**
    - [embedding_tuple_data_v1](https://huggingface.co/datasets/deebak14/embedding_tuple_data_v1)
<!-- - **Language:** Unknown -->
<!-- - **License:** Unknown -->

### Model Sources

- **Documentation:** [Sentence Transformers Documentation](https://sbert.net)
- **Repository:** [Sentence Transformers on GitHub](https://github.com/UKPLab/sentence-transformers)
- **Hugging Face:** [Sentence Transformers on Hugging Face](https://huggingface.co/models?library=sentence-transformers)

### Full Model Architecture

```
SentenceTransformer(
  (0): Transformer({'max_seq_length': 2048, 'do_lower_case': False, 'architecture': 'Gemma3TextModel'})
  (1): Pooling({'word_embedding_dimension': 768, 'pooling_mode_cls_token': False, 'pooling_mode_mean_tokens': True, 'pooling_mode_max_tokens': False, 'pooling_mode_mean_sqrt_len_tokens': False, 'pooling_mode_weightedmean_tokens': False, 'pooling_mode_lasttoken': False, 'include_prompt': True})
  (2): Dense({'in_features': 768, 'out_features': 3072, 'bias': False, 'activation_function': 'torch.nn.modules.linear.Identity'})
  (3): Dense({'in_features': 3072, 'out_features': 768, 'bias': False, 'activation_function': 'torch.nn.modules.linear.Identity'})
  (4): Normalize()
)
```

## Usage

### Direct Usage (Sentence Transformers)

First install the Sentence Transformers library:

```bash
pip install -U sentence-transformers
```

Then you can load this model and run inference.
```python
from sentence_transformers import SentenceTransformer

# Download from the 🤗 Hub
model = SentenceTransformer("deebak14/embedding_gemma_ft_v1")
# Run inference
queries = [
    "I need to find where a flat surface meets a sphere. How can I do that in Rhino?",
]
documents = [
    'You can use the following methods to complete the task.\nmethod: PlaneSphereIntersection\ndescription: Calculates the intersection of a plane and a sphere.\nsyntax: PlaneSphereIntersection(plane, sphere_plane, sphere_radius)\nparameters: plane (plane): The plane to intersect; sphere_plane (plane): Equatorial plane of the sphere (origin is center); sphere_radius (float): Radius of the sphere.\nreturns: list: [type, point/plane, radius] where type=0 for point, 1 for circle. None on error.\n\nFollowing is the code that uses this method to complete the task as per user query.\n\n```python\nimport rhinoscriptsyntax as rs\n\n# Define a flat surface as a plane\nplane = rs.WorldXYPlane()\n# Define the radius of the sphere\nradius = 10\n# Calculate the intersection between the plane and the sphere\nresults = rs.PlaneSphereIntersection(plane, plane, radius)\n\n# Check if there are results and handle them accordingly\nif results:\n    if results[0] == 0:\n        # If the intersection is a point, add it to the document\n        rs.AddPoint(results[1])\n    else:\n        # If the intersection is a circle, add it to the document\n        rs.AddCircle(results[1], results[2])\n```',
    'You cannot use the following methods LineSphereIntersection, IsSphere, AddSphere, LinePlaneIntersection, Angle, CircleCenterPoint, CurveCurveIntersection, CurveSurfaceIntersection, AddCircle3Pt',
    'plane',
]
query_embeddings = model.encode_query(queries)
document_embeddings = model.encode_document(documents)
print(query_embeddings.shape, document_embeddings.shape)
# [1, 768] [3, 768]

# Get the similarity scores for the embeddings
similarities = model.similarity(query_embeddings, document_embeddings)
print(similarities)
# tensor([[ 0.6658,  0.4819, -0.1617]])
```

<!--
### Direct Usage (Transformers)

<details><summary>Click to see the direct usage in Transformers</summary>

</details>
-->

<!--
### Downstream Usage (Sentence Transformers)

You can finetune this model on your own dataset.

<details><summary>Click to expand</summary>

</details>
-->

<!--
### Out-of-Scope Use

*List how the model may foreseeably be misused and address what users ought not to do with the model.*
-->

## Evaluation

### Metrics

#### Triplet

* Dataset: `base-eval`
* Evaluated with [<code>TripletEvaluator</code>](https://sbert.net/docs/package_reference/sentence_transformer/evaluation.html#sentence_transformers.evaluation.TripletEvaluator)

| Metric              | Value   |
|:--------------------|:--------|
| **cosine_accuracy** | **1.0** |

<!--
## Bias, Risks and Limitations

*What are the known or foreseeable issues stemming from this model? You could also flag here known failure cases or weaknesses of the model.*
-->

<!--
### Recommendations

*What are recommendations with respect to the foreseeable issues? For example, filtering explicit content.*
-->

## Training Details

### Training Dataset

#### embedding_tuple_data_v1

* Dataset: [embedding_tuple_data_v1](https://huggingface.co/datasets/deebak14/embedding_tuple_data_v1) at [b592a1a](https://huggingface.co/datasets/deebak14/embedding_tuple_data_v1/tree/b592a1af60cff995640f6979dbf36c01d38c40a8)
* Size: 15,565 training samples
* Columns: <code>anchor</code> and <code>positive</code>
* Approximate statistics based on the first 1000 samples:
  |         | anchor                                                                            | positive                                                                             |
  |:--------|:----------------------------------------------------------------------------------|:-------------------------------------------------------------------------------------|
  | type    | string                                                                            | string                                                                               |
  | details | <ul><li>min: 9 tokens</li><li>mean: 15.98 tokens</li><li>max: 50 tokens</li></ul> | <ul><li>min: 42 tokens</li><li>mean: 177.53 tokens</li><li>max: 810 tokens</li></ul> |
* Samples:
  | anchor                                                                         | positive                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
  |:-------------------------------------------------------------------------------|:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
  | <code>Provide an example of using AddRectangle.</code>                         | <code>import rhinoscriptsyntax as rs<br>plane = rs.WorldXYPlane()<br>plane = rs.RotatePlane(plane, 45.0, [0,0,1])<br>rs.AddRectangle(plane, 5.0, 15.0) <br><br>Metadata: <br>Name: AddRectangle<br>Category: curve<br>Function Signature: rs.AddRectangle(plane: plane, width: number, height: number) -> guid<br>Description: Add a rectangular curve to the document</code>                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |
  | <code>How do I search for the total number of linetypes in my document?</code> | <code><br><br>You can use the following method:<br>Name: LinetypeCount<br>Category: linetype<br>Function Signature: rs.LinetypeCount() -> int<br>Description: Description: Returns the number of linetypes in the document.<br>Parameters:<br>    None<br>Returns:<br>    int: The number of linetypes in the document.</code>                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
  | <code>How do I maintain the shape of a curve while fitting it?</code>          | <code><br><br>You can use the following method:<br>Name: FitCurve<br>Category: curve<br>Function Signature: rs.FitCurve(curve_id: guid, degree: int = 3, distance_tolerance: float = -1, angle_tolerance: float = -1) -> guid<br>Description: Description: Reduces the number of control points of a curve while maintaining its general shape. This function is useful for replacing curves with many control points. For more information, see the Rhino help for the FitCrv command.<br>Parameters:<br>    curve_id (guid): Identifier of the curve object to be fitted.<br>    eg: '3D4F5A6B-7C8D-9E0F-1A2B-3C4D5E6F7A8B'<br>    degree (int, optional): The degree of the curve, which must be greater than 1. The default is 3.<br>    eg: 3<br>    distance_tolerance (float, optional): The fitting tolerance. If not specified or <= 0.0, the document absolute tolerance is used.<br>    eg: 0.01<br>    angle_tolerance (float, optional): The kink smoothing tolerance in degrees. If 0.0, all kinks are smoothed. If > 0.0, kinks smaller than this value are smoothed. If ...</code> |
* Loss: [<code>MultipleNegativesRankingLoss</code>](https://sbert.net/docs/package_reference/sentence_transformer/losses.html#multiplenegativesrankingloss) with these parameters:
  ```json
  {
      "scale": 20.0,
      "similarity_fct": "cos_sim",
      "gather_across_devices": false
  }
  ```

### Evaluation Dataset

#### embedding_triplet_data_v1

* Dataset: [embedding_triplet_data_v1](https://huggingface.co/datasets/deebak14/embedding_triplet_data_v1) at [71ea1de](https://huggingface.co/datasets/deebak14/embedding_triplet_data_v1/tree/71ea1de1dd869a91bfa545c4f65e1d1d5ac41186)
* Size: 476 evaluation samples
* Columns: <code>anchor</code>, <code>positive</code>, and <code>negative</code>
* Approximate statistics based on the first 476 samples:
  |         | anchor                                                                             | positive                                                                               | negative                                                                           |
  |:--------|:-----------------------------------------------------------------------------------|:---------------------------------------------------------------------------------------|:-----------------------------------------------------------------------------------|
  | type    | string                                                                             | string                                                                                 | string                                                                             |
  | details | <ul><li>min: 15 tokens</li><li>mean: 23.13 tokens</li><li>max: 38 tokens</li></ul> | <ul><li>min: 111 tokens</li><li>mean: 252.44 tokens</li><li>max: 1015 tokens</li></ul> | <ul><li>min: 32 tokens</li><li>mean: 42.48 tokens</li><li>max: 55 tokens</li></ul> |
* Samples:
  | anchor                                                                                    | positive                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            | negative                                                                                                                                                                          |
  |:------------------------------------------------------------------------------------------|:------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
  | <code>I need to flatten a curved surface for laser cutting. How can I do that?</code>     | <code>You can use the following methods to complete the task.<br>method: UnrollSurface<br>description: Flattens a developable surface or polysurface<br>syntax: UnrollSurface(surface_id, explode=False, following_geometry=None, absolute_tolerance=None, relative_tolerance=None)<br>parameters: <br>surface_id (guid): the surface's identifier
  <br>explode (bool, optional): If True, the resulting surfaces ar not joined
  <br>following_geometry ({guid, ...]): List of curves, dots, and points which
  <br>  should be unrolled with the surface<br><br>returns: <br>list(guid, ...): of unrolled surface ids
  <br>tuple((guid, ...),(guid, ...)): if following_geometry is not None, a tuple
  <br>  [1] is the list of unrolled surface ids
  <br>  [2] is the list of unrolled following geometry<br><br><br>Following is the code that uses this method to complete the task as per user query.<br><br>```python<br>import rhinoscriptsyntax as rs<br><br># Flatten a curved surface for laser cutting<br>surface = rs.GetObject("Select curved surface to flatten", rs.filter.surface)<br>if surface:<br>    # Unrol...</code> | <code>You cannot use the following methods ConvertCurveToPolyline, MeshOutline, PullCurveToMesh, ExplodeText, MeshToNurb, IsCurvePlanar, Angle, AddFilletCurve, MeshVolume</code> |
  | <code>Can you show me how to rotate a plane by 30 degrees around its normal axis?</code>  | <code>You can use the following methods to complete the task.<br>method: PlaneTransform<br>description: Transforms a plane.<br>syntax: PlaneTransform(plane, xform)<br>parameters: plane (plane): Plane to transform; xform (transform): Transformation to apply.<br>returns: plane: Resulting plane if successful, otherwise None.<br><br>Following is the code that uses this method to complete the task as per user query.<br><br>```python<br>import rhinoscriptsyntax as rs<br><br># Get the current construction plane<br>plane = rs.ViewCPlane()<br><br># Create a rotation transformation of 30 degrees around the normal axis (Z-axis)<br>xform = rs.XformRotation(30.0, plane.ZAxis, plane.Origin)<br><br># Apply the transformation to the plane<br>plane = rs.PlaneTransform(plane, xform)<br><br># Set the new construction plane<br>rs.ViewCPlane(None, plane)<br>```</code>                                                                                                                                                                                                                                         | <code>You cannot use the following methods RotatePlane, XformRotation1, PlaneFromNormal, VectorRotate, Angle, PlaneFromFrame, LinePlane, MovePlane, CreatePlane</code>            |
  | <code>I want to change the height of a text dot I just created. How can I do that?</code> | <code>You can use the following methods to complete the task.<br>method: TextDotHeight<br>description: Returns or modified the font height of a text dot<br>syntax: TextDotHeight(object_id, height=None)<br>parameters: <br>object_id (guid): identifier of a text dot object
  <br>height (number, optional) new font height<br><br>returns: <br>number: If height is not specified, the current text dot height
  <br>number: If height is specified, the previous text dot height
  <br>None: on error<br><br><br>Following is the code that uses this method to complete the task as per user query.<br><br>```python<br>import rhinoscriptsyntax as rs<br># Change the height of a text dot<br>obj = rs.GetObject("Select text dot")<br>if rs.IsTextDot(obj):<br>    previous_height = rs.TextDotHeight(obj, 15.0)  # Set new height to 15.0<br>    print(f"Previous height was: {previous_height}")<br>```</code>                                                                                                                                                                                                                  | <code>You cannot use the following methods TextDotPoint, TextDotFont, TextDotText, TextObjectHeight, IsTextDot, AddTextDot, TextObjectFont, PointCoordinates, ExplodeText</code>  |
* Loss: [<code>MultipleNegativesRankingLoss</code>](https://sbert.net/docs/package_reference/sentence_transformer/losses.html#multiplenegativesrankingloss) with these parameters:
  ```json
  {
      "scale": 20.0,
      "similarity_fct": "cos_sim",
      "gather_across_devices": false
  }
  ```

### Training Hyperparameters
#### Non-Default Hyperparameters

- `eval_strategy`: steps
- `per_device_train_batch_size`: 16
- `per_device_eval_batch_size`: 16
- `learning_rate`: 2e-05
- `warmup_ratio`: 0.1
- `bf16`: True
- `prompts`: task: sentence similarity | query: 
- `batch_sampler`: no_duplicates

#### All Hyperparameters
<details><summary>Click to expand</summary>

- `overwrite_output_dir`: False
- `do_predict`: False
- `eval_strategy`: steps
- `prediction_loss_only`: True
- `per_device_train_batch_size`: 16
- `per_device_eval_batch_size`: 16
- `per_gpu_train_batch_size`: None
- `per_gpu_eval_batch_size`: None
- `gradient_accumulation_steps`: 1
- `eval_accumulation_steps`: None
- `torch_empty_cache_steps`: None
- `learning_rate`: 2e-05
- `weight_decay`: 0.0
- `adam_beta1`: 0.9
- `adam_beta2`: 0.999
- `adam_epsilon`: 1e-08
- `max_grad_norm`: 1.0
- `num_train_epochs`: 3
- `max_steps`: -1
- `lr_scheduler_type`: linear
- `lr_scheduler_kwargs`: {}
- `warmup_ratio`: 0.1
- `warmup_steps`: 0
- `log_level`: passive
- `log_level_replica`: warning
- `log_on_each_node`: True
- `logging_nan_inf_filter`: True
- `save_safetensors`: True
- `save_on_each_node`: False
- `save_only_model`: False
- `restore_callback_states_from_checkpoint`: False
- `no_cuda`: False
- `use_cpu`: False
- `use_mps_device`: False
- `seed`: 42
- `data_seed`: None
- `jit_mode_eval`: False
- `use_ipex`: False
- `bf16`: True
- `fp16`: False
- `fp16_opt_level`: O1
- `half_precision_backend`: auto
- `bf16_full_eval`: False
- `fp16_full_eval`: False
- `tf32`: None
- `local_rank`: 0
- `ddp_backend`: None
- `tpu_num_cores`: None
- `tpu_metrics_debug`: False
- `debug`: []
- `dataloader_drop_last`: False
- `dataloader_num_workers`: 0
- `dataloader_prefetch_factor`: None
- `past_index`: -1
- `disable_tqdm`: False
- `remove_unused_columns`: True
- `label_names`: None
- `load_best_model_at_end`: False
- `ignore_data_skip`: False
- `fsdp`: []
- `fsdp_min_num_params`: 0
- `fsdp_config`: {'min_num_params': 0, 'xla': False, 'xla_fsdp_v2': False, 'xla_fsdp_grad_ckpt': False}
- `fsdp_transformer_layer_cls_to_wrap`: None
- `accelerator_config`: {'split_batches': False, 'dispatch_batches': None, 'even_batches': True, 'use_seedable_sampler': True, 'non_blocking': False, 'gradient_accumulation_kwargs': None}
- `parallelism_config`: None
- `deepspeed`: None
- `label_smoothing_factor`: 0.0
- `optim`: adamw_torch_fused
- `optim_args`: None
- `adafactor`: False
- `group_by_length`: False
- `length_column_name`: length
- `ddp_find_unused_parameters`: None
- `ddp_bucket_cap_mb`: None
- `ddp_broadcast_buffers`: False
- `dataloader_pin_memory`: True
- `dataloader_persistent_workers`: False
- `skip_memory_metrics`: True
- `use_legacy_prediction_loop`: False
- `push_to_hub`: False
- `resume_from_checkpoint`: None
- `hub_model_id`: None
- `hub_strategy`: every_save
- `hub_private_repo`: None
- `hub_always_push`: False
- `hub_revision`: None
- `gradient_checkpointing`: False
- `gradient_checkpointing_kwargs`: None
- `include_inputs_for_metrics`: False
- `include_for_metrics`: []
- `eval_do_concat_batches`: True
- `fp16_backend`: auto
- `push_to_hub_model_id`: None
- `push_to_hub_organization`: None
- `mp_parameters`: 
- `auto_find_batch_size`: False
- `full_determinism`: False
- `torchdynamo`: None
- `ray_scope`: last
- `ddp_timeout`: 1800
- `torch_compile`: False
- `torch_compile_backend`: None
- `torch_compile_mode`: None
- `include_tokens_per_second`: False
- `include_num_input_tokens_seen`: False
- `neftune_noise_alpha`: None
- `optim_target_modules`: None
- `batch_eval_metrics`: False
- `eval_on_start`: False
- `use_liger_kernel`: False
- `liger_kernel_config`: None
- `eval_use_gather_object`: False
- `average_tokens_across_devices`: False
- `prompts`: task: sentence similarity | query: 
- `batch_sampler`: no_duplicates
- `multi_dataset_batch_sampler`: proportional
- `router_mapping`: {}
- `learning_rate_mapping`: {}

</details>

### Training Logs
| Epoch  | Step | Training Loss | Validation Loss | base-eval_cosine_accuracy |
|:------:|:----:|:-------------:|:---------------:|:-------------------------:|
| -1     | -1   | -             | -               | 0.0147                    |
| 0.1028 | 100  | 0.1601        | -               | -                         |
| 0.2055 | 200  | 0.0474        | 0.2296          | 0.8971                    |
| 0.3083 | 300  | 0.0749        | -               | -                         |
| 0.4111 | 400  | 0.1037        | 0.1457          | 0.9265                    |
| 0.5139 | 500  | 0.0564        | -               | -                         |
| 0.6166 | 600  | 0.0706        | 0.3362          | 0.9475                    |
| 0.7194 | 700  | 0.0549        | -               | -                         |
| 0.8222 | 800  | 0.0427        | 0.2154          | 0.9538                    |
| 0.9250 | 900  | 0.0599        | -               | -                         |
| 1.0277 | 1000 | 0.0656        | 0.2439          | 0.9706                    |
| 1.1305 | 1100 | 0.0409        | -               | -                         |
| 1.2333 | 1200 | 0.0283        | 0.2422          | 0.9727                    |
| 1.3361 | 1300 | 0.0336        | -               | -                         |
| 1.4388 | 1400 | 0.0338        | 0.2397          | 0.9664                    |
| 1.5416 | 1500 | 0.0384        | -               | -                         |
| 1.6444 | 1600 | 0.0271        | 0.1048          | 0.9832                    |
| 1.7472 | 1700 | 0.0305        | -               | -                         |
| 1.8499 | 1800 | 0.024         | 0.1172          | 0.9916                    |
| 1.9527 | 1900 | 0.014         | -               | -                         |
| 2.0555 | 2000 | 0.018         | 0.0898          | 0.9958                    |
| 2.1583 | 2100 | 0.0091        | -               | -                         |
| 2.2610 | 2200 | 0.0154        | 0.0721          | 0.9916                    |
| 2.3638 | 2300 | 0.0123        | -               | -                         |
| 2.4666 | 2400 | 0.0119        | 0.0876          | 0.9937                    |
| 2.5694 | 2500 | 0.0173        | -               | -                         |
| 2.6721 | 2600 | 0.0091        | 0.0482          | 1.0                       |
| 2.7749 | 2700 | 0.0211        | -               | -                         |
| 2.8777 | 2800 | 0.0146        | 0.0550          | 1.0                       |
| 2.9805 | 2900 | 0.0101        | -               | -                         |
| -1     | -1   | -             | -               | 1.0                       |


### Framework Versions
- Python: 3.12.11
- Sentence Transformers: 5.1.0
- Transformers: 4.56.1
- PyTorch: 2.8.0+cu126
- Accelerate: 1.10.1
- Datasets: 4.0.0
- Tokenizers: 0.22.0

## Citation

### BibTeX

#### Sentence Transformers
```bibtex
@inproceedings{reimers-2019-sentence-bert,
    title = "Sentence-BERT: Sentence Embeddings using Siamese BERT-Networks",
    author = "Reimers, Nils and Gurevych, Iryna",
    booktitle = "Proceedings of the 2019 Conference on Empirical Methods in Natural Language Processing",
    month = "11",
    year = "2019",
    publisher = "Association for Computational Linguistics",
    url = "https://arxiv.org/abs/1908.10084",
}
```

#### MultipleNegativesRankingLoss
```bibtex
@misc{henderson2017efficient,
    title={Efficient Natural Language Response Suggestion for Smart Reply},
    author={Matthew Henderson and Rami Al-Rfou and Brian Strope and Yun-hsuan Sung and Laszlo Lukacs and Ruiqi Guo and Sanjiv Kumar and Balint Miklos and Ray Kurzweil},
    year={2017},
    eprint={1705.00652},
    archivePrefix={arXiv},
    primaryClass={cs.CL}
}
```

<!--
## Glossary

*Clearly define terms in order to be accessible across audiences.*
-->

<!--
## Model Card Authors

*Lists the people who create the model card, providing recognition and accountability for the detailed work that goes into its construction.*
-->

<!--
## Model Card Contact

*Provides a way for people who have updates to the Model Card, suggestions, or questions, to contact the Model Card authors.*
-->