Skip to content

Commit e7f47b0

Browse files
authored
Merge pull request hkulekci#37 from hkulekci/quantization_config-paramater
quantization_config parameter implemented for Update and Create Colle…
2 parents 96e2dde + f0edb68 commit e7f47b0

12 files changed

Lines changed: 395 additions & 0 deletions
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
<?php
2+
/**
3+
* BinaryQuantization
4+
*
5+
* @since Oct 2023
6+
* @author Haydar KULEKCI <haydarkulekci@gmail.com>
7+
*/
8+
9+
namespace Qdrant\Models\Request\CollectionConfig;
10+
11+
class BinaryQuantization implements QuantizationConfig
12+
{
13+
public function __construct(protected ?bool $alwaysRam = null)
14+
{
15+
}
16+
17+
public function toArray(): array
18+
{
19+
$binary = [];
20+
21+
if ($this->alwaysRam !== null) {
22+
$binary['always_ram'] = $this->alwaysRam;
23+
}
24+
25+
return [
26+
'binary' => $binary ?: new \stdClass(),
27+
];
28+
}
29+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<?php
2+
/**
3+
* DisabledQuantization
4+
*
5+
* @since Oct 2023
6+
* @author Haydar KULEKCI <haydarkulekci@gmail.com>
7+
*/
8+
9+
namespace Qdrant\Models\Request\CollectionConfig;
10+
11+
class DisabledQuantization implements QuantizationConfig
12+
{
13+
public function toArray(): array
14+
{
15+
return [
16+
'Disabled'
17+
];
18+
}
19+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
<?php
2+
/**
3+
* ProductQuantization
4+
*
5+
* @since Oct 2023
6+
* @author Haydar KULEKCI <haydarkulekci@gmail.com>
7+
*/
8+
9+
namespace Qdrant\Models\Request\CollectionConfig;
10+
11+
class ProductQuantization implements QuantizationConfig
12+
{
13+
public function __construct(protected string $compression, protected ?bool $alwaysRam = null)
14+
{
15+
}
16+
17+
public function toArray(): array
18+
{
19+
$product = [
20+
'compression' => $this->compression
21+
];
22+
23+
if ($this->alwaysRam !== null) {
24+
$product['always_ram'] = $this->alwaysRam;
25+
}
26+
27+
return [
28+
'product' => $product
29+
];
30+
}
31+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<?php
2+
/**
3+
* QuantizationConfig.php
4+
*
5+
* @since Oct 2023
6+
* @author Haydar KULEKCI <haydarkulekci@gmail.com>
7+
*/
8+
9+
namespace Qdrant\Models\Request\CollectionConfig;
10+
11+
interface QuantizationConfig
12+
{
13+
public function toArray(): array;
14+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
<?php
2+
/**
3+
* ScalarQuantization
4+
*
5+
* @since Oct 2023
6+
* @author Haydar KULEKCI <haydarkulekci@gmail.com>
7+
*/
8+
9+
namespace Qdrant\Models\Request\CollectionConfig;
10+
11+
class ScalarQuantization implements QuantizationConfig
12+
{
13+
public function __construct(protected string $type, protected ?float $quantile = null, protected ?bool $alwaysRam = null)
14+
{
15+
}
16+
17+
public function toArray(): array
18+
{
19+
$scalar = [
20+
'type' => $this->type
21+
];
22+
23+
if ($this->quantile !== null) {
24+
$scalar['quantile'] = $this->quantile;
25+
}
26+
27+
if ($this->alwaysRam !== null) {
28+
$scalar['always_ram'] = $this->alwaysRam;
29+
}
30+
31+
return [
32+
'scalar' => $scalar
33+
];
34+
}
35+
}

src/Models/Request/CreateCollection.php

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@
88

99
namespace Qdrant\Models\Request;
1010

11+
use Qdrant\Models\Request\CollectionConfig\DisabledQuantization;
12+
use Qdrant\Models\Request\CollectionConfig\QuantizationConfig;
13+
1114
class CreateCollection implements RequestModel
1215
{
1316
/**
@@ -23,6 +26,8 @@ class CreateCollection implements RequestModel
2326

2427
protected ?InitFrom $initFrom = null;
2528

29+
protected ?QuantizationConfig $quantizationConfig = null;
30+
2631
public function addVector(VectorParams $vectorParams, string $name = null): CreateCollection
2732
{
2833
if ($name !== null) {
@@ -69,7 +74,12 @@ public function setInitFrom(InitFrom $initFrom): CreateCollection
6974
return $this;
7075
}
7176

77+
public function setQuantizationConfig(QuantizationConfig $quantizationConfig): CreateCollection
78+
{
79+
$this->quantizationConfig = $quantizationConfig;
7280

81+
return $this;
82+
}
7383

7484
public function toArray(): array
7585
{
@@ -93,6 +103,12 @@ public function toArray(): array
93103
$data['init_from'] = $this->initFrom->toArray();
94104
}
95105

106+
if ($this->quantizationConfig instanceof DisabledQuantization) {
107+
$data['quantization_config'] = 'Disabled';
108+
} else if ($this->quantizationConfig !== null) {
109+
$data['quantization_config'] = $this->quantizationConfig->toArray();
110+
}
111+
96112
return $data;
97113
}
98114
}

src/Models/Request/UpdateCollection.php

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,17 @@
88

99
namespace Qdrant\Models\Request;
1010

11+
use Qdrant\Models\Request\CollectionConfig\DisabledQuantization;
12+
use Qdrant\Models\Request\CollectionConfig\QuantizationConfig;
13+
1114
class UpdateCollection implements RequestModel
1215
{
1316
protected ?OptimizersConfigDiff $optimizersConfig = null;
1417

1518
protected ?CollectionParamsDiff $collectionParamsDiff = null;
1619

20+
protected ?QuantizationConfig $quantizationConfig = null;
21+
1722
public function addOptimizersConfigDiff(OptimizersConfigDiff $optimizersConfig): UpdateCollection
1823
{
1924
$this->optimizersConfig = $optimizersConfig;
@@ -28,6 +33,13 @@ public function addCollectionParamsDiff(CollectionParamsDiff $collectionParamsDi
2833
return $this;
2934
}
3035

36+
public function setQuantizationConfig(QuantizationConfig $quantizationConfig): UpdateCollection
37+
{
38+
$this->quantizationConfig = $quantizationConfig;
39+
40+
return $this;
41+
}
42+
3143
public function toArray(): array
3244
{
3345
$data = [];
@@ -38,6 +50,12 @@ public function toArray(): array
3850
$data['collection_params_diff'] = $this->collectionParamsDiff->toArray();
3951
}
4052

53+
if ($this->quantizationConfig instanceof DisabledQuantization) {
54+
$data['quantization_config'] = 'Disabled';
55+
} else if ($this->quantizationConfig !== null) {
56+
$data['quantization_config'] = $this->quantizationConfig->toArray();
57+
}
58+
4159
return $data;
4260
}
4361
}
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
<?php
2+
/**
3+
* Collections
4+
*
5+
* @since Mar 2023
6+
* @author Haydar KULEKCI <haydarkulekci@gmail.com>
7+
*/
8+
namespace Qdrant\Tests\Integration\Endpoints\Collections;
9+
10+
use Qdrant\Endpoints\Collections;
11+
use Qdrant\Models\Request\CollectionConfig\BinaryQuantization;
12+
use Qdrant\Models\Request\CollectionConfig\DisabledQuantization;
13+
use Qdrant\Models\Request\CollectionConfig\ProductQuantization;
14+
use Qdrant\Models\Request\CollectionConfig\ScalarQuantization;
15+
use Qdrant\Models\Request\CreateCollection;
16+
use Qdrant\Models\Request\UpdateCollection;
17+
use Qdrant\Models\Request\VectorParams;
18+
use Qdrant\Tests\Integration\AbstractIntegration;
19+
20+
class QuantizationConfigTest extends AbstractIntegration
21+
{
22+
public function testCollectionsProductQuantization(): void
23+
{
24+
$request = (new CreateCollection())->setQuantizationConfig(new ProductQuantization('x4'))
25+
->addVector(new VectorParams(300, VectorParams::DISTANCE_COSINE), 'image');
26+
27+
$collections = new Collections($this->client);
28+
$collections->setCollectionName('sample-collection');
29+
$collections->create($request);
30+
$collections = new Collections($this->client);
31+
$response = $collections->setCollectionName('sample-collection')->info();
32+
$this->assertEquals('ok', $response['status']);
33+
34+
$this->assertEquals([
35+
'product' => [
36+
'compression' => 'x4'
37+
]
38+
], $response['result']['config']['quantization_config']);
39+
}
40+
41+
public function testCollectionsBinaryQuantization(): void
42+
{
43+
$request = (new CreateCollection())->setQuantizationConfig(new BinaryQuantization())
44+
->addVector(new VectorParams(300, VectorParams::DISTANCE_COSINE), 'image');
45+
46+
$collections = new Collections($this->client);
47+
$collections->setCollectionName('sample-collection');
48+
$collections->create($request);
49+
$collections = new Collections($this->client);
50+
$response = $collections->setCollectionName('sample-collection')->info();
51+
$this->assertEquals('ok', $response['status']);
52+
$this->assertEquals([
53+
'binary' => []
54+
], $response['result']['config']['quantization_config']);
55+
}
56+
57+
public function testCollectionsScalarQuantization(): void
58+
{
59+
$request = (new CreateCollection())->setQuantizationConfig(new ScalarQuantization('int8'))
60+
->addVector(new VectorParams(300, VectorParams::DISTANCE_COSINE), 'image');
61+
62+
$collections = new Collections($this->client);
63+
$collections->setCollectionName('sample-collection');
64+
$collections->create($request);
65+
$collections = new Collections($this->client);
66+
$response = $collections->setCollectionName('sample-collection')->info();
67+
$this->assertEquals('ok', $response['status']);
68+
$this->assertEquals([
69+
'scalar' => [
70+
'type' => 'int8'
71+
]
72+
], $response['result']['config']['quantization_config']);
73+
}
74+
75+
public function testCollectionsDisabledQuantization(): void
76+
{
77+
$request = (new CreateCollection())->setQuantizationConfig(new BinaryQuantization())
78+
->addVector(new VectorParams(300, VectorParams::DISTANCE_COSINE), 'image');
79+
80+
$collections = new Collections($this->client);
81+
$collections->setCollectionName('sample-collection');
82+
$collections->create($request);
83+
84+
$response = $collections->setCollectionName('sample-collection')->info();
85+
$this->assertEquals('ok', $response['status']);
86+
$this->assertEquals([
87+
'binary' => []
88+
], $response['result']['config']['quantization_config']);
89+
90+
$updateRequest = (new UpdateCollection())->setQuantizationConfig(new DisabledQuantization());
91+
$response = $collections->update($updateRequest);
92+
$this->assertEquals('ok', $response['status']);
93+
94+
$response = $collections->setCollectionName('sample-collection')->info();
95+
$this->assertEquals('ok', $response['status']);
96+
$this->assertNull($response['result']['config']['quantization_config']);
97+
}
98+
99+
100+
protected function tearDown(): void
101+
{
102+
parent::tearDown();
103+
$collections = new Collections($this->client);
104+
$collections->setCollectionName('sample-collection')->delete();
105+
}
106+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
<?php
2+
/**
3+
* @since Oct 2023
4+
* @author Haydar KULEKCI <haydarkulekci@gmail.com>
5+
*/
6+
7+
namespace Qdrant\Tests\Unit\Models\Request\CollectionConfig;
8+
9+
use PHPUnit\Framework\TestCase;
10+
use Qdrant\Models\Request\CollectionConfig\BinaryQuantization;
11+
12+
class BinaryQuantizationTest extends TestCase
13+
{
14+
public function testBasic(): void
15+
{
16+
$config = new BinaryQuantization();
17+
18+
$this->assertEquals(['binary' => new \stdClass()], $config->toArray());
19+
}
20+
21+
public function testWithAlwaysRamTrue(): void
22+
{
23+
$config = new BinaryQuantization(true);
24+
25+
$this->assertEquals([
26+
'binary' => [
27+
'always_ram' => true
28+
]
29+
], $config->toArray());
30+
}
31+
32+
public function testWithAlwaysRamFalse(): void
33+
{
34+
$config = new BinaryQuantization(false);
35+
36+
$this->assertEquals([
37+
'binary' => [
38+
'always_ram' => false
39+
]
40+
], $config->toArray());
41+
}
42+
}

0 commit comments

Comments
 (0)