Skip to content

Commit 723b1a0

Browse files
author
Daniel García
committed
[Added] settings for branch and bound algorithm
1 parent ae21578 commit 723b1a0

File tree

5 files changed

+61
-14
lines changed

5 files changed

+61
-14
lines changed

app/src/main/java/com/tripletres/platformscience/domain/AssignDriversToShipmentsUseCase.kt

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@ package com.tripletres.platformscience.domain
22

33
import com.tripletres.platformscience.data.repo.DriverRepository
44
import com.tripletres.platformscience.data.repo.ShipmentRepository
5+
import com.tripletres.platformscience.domain.algorithm.AssignationAlgorithmType
6+
import com.tripletres.platformscience.domain.algorithm.BranchAndBoundAlgorithm
57
import com.tripletres.platformscience.domain.algorithm.GreedyAssignationAlgorithm
6-
import com.tripletres.platformscience.domain.model.Driver
7-
import com.tripletres.platformscience.domain.model.Shipment
8-
import com.tripletres.platformscience.domain.model.asDriverList
9-
import com.tripletres.platformscience.domain.model.asShipmentList
8+
import com.tripletres.platformscience.domain.algorithm.IAssignationAlgorithm
9+
import com.tripletres.platformscience.domain.model.*
1010
import javax.inject.Inject
1111

1212
/**
@@ -18,11 +18,14 @@ class AssignDriversToShipmentsUseCase @Inject constructor(
1818
private val saveDriversAssigned: SaveDriversAssignedToShipmentsUseCase,
1919
) {
2020

21-
suspend operator fun invoke(): List<Driver> {
21+
// Can be changed for your favorite algorithm
22+
private val defaultAlgorithm = AssignationAlgorithmType.BRANCH.name
23+
24+
suspend operator fun invoke(algorithm: String?): List<Driver> {
2225
val drivers = driverRepository.getDriversFromDB().asDriverList()
2326
val shipments = shipmentRepository.getShipmentsFromDB().asShipmentList()
2427

25-
val driverAssigned = assignDriversToShipment(drivers, shipments)
28+
val driverAssigned = assignDriversToShipment(drivers, shipments, algorithm)
2629
//Save in assigned drivers
2730
saveDriversAssigned(driverAssigned)
2831
return driverAssigned
@@ -31,8 +34,23 @@ class AssignDriversToShipmentsUseCase @Inject constructor(
3134
/**
3235
* Perform assignation of shipments to drivers
3336
*/
34-
private fun assignDriversToShipment(drivers: List<Driver>, shipments: List<Shipment>): List<Driver> {
35-
return ShipmentDriverAssignation(GreedyAssignationAlgorithm()).execute(drivers, shipments)
37+
private fun assignDriversToShipment(
38+
drivers: List<Driver>,
39+
shipments: List<Shipment>,
40+
algorithm: String?,
41+
): List<Driver> {
42+
return ShipmentDriverAssignation(defineAlgorithm(algorithm)).execute(drivers, shipments)
43+
}
44+
45+
/**
46+
* Gets assignation algorithm from type or default
47+
*/
48+
private fun defineAlgorithm(algorithm: String?): IAssignationAlgorithm {
49+
val type = algorithm ?: defaultAlgorithm
50+
return when (type.toAssignationAlgorithmType()) {
51+
AssignationAlgorithmType.GREEDY -> GreedyAssignationAlgorithm()
52+
AssignationAlgorithmType.BRANCH -> BranchAndBoundAlgorithm()
53+
}
3654
}
3755

3856
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package com.tripletres.platformscience.domain.algorithm
2+
3+
/**
4+
* To identify what type of algorithm to use
5+
*/
6+
enum class AssignationAlgorithmType {
7+
GREEDY,
8+
BRANCH,
9+
}

app/src/main/java/com/tripletres/platformscience/domain/model/Converter.kt

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package com.tripletres.platformscience.domain.model
33
import com.tripletres.platformscience.data.db.driver.DriverAssignationEntity
44
import com.tripletres.platformscience.data.db.driver.DriverEntity
55
import com.tripletres.platformscience.data.db.shipment.ShipmentEntity
6+
import com.tripletres.platformscience.domain.algorithm.AssignationAlgorithmType
67
import com.tripletres.platformscience.ui.model.DriverItem
78
import com.tripletres.platformscience.ui.model.ShipmentItem
89

@@ -57,3 +58,14 @@ fun Driver.asDriverEntity(): DriverEntity {
5758
}
5859

5960
private fun Shipment.asShipmentEntity(): ShipmentEntity = ShipmentEntity(this.id, this.address)
61+
62+
/**
63+
* Algorithm type converter
64+
*/
65+
fun String.toAssignationAlgorithmType(): AssignationAlgorithmType {
66+
return when (this) {
67+
"GREEDY" -> AssignationAlgorithmType.GREEDY
68+
"BRANCH_BOUND" -> AssignationAlgorithmType.BRANCH
69+
else -> TODO("No available")
70+
}
71+
}

app/src/main/java/com/tripletres/platformscience/ui/view/splash/SplashViewModel.kt

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@ import com.tripletres.platformscience.domain.AssignDriversToShipmentsUseCase
66
import com.tripletres.platformscience.domain.LoadDriversShipmentsUseCase
77
import com.tripletres.platformscience.ui.model.DriverItem
88
import com.tripletres.platformscience.util.LogUtils
9+
import com.tripletres.platformscience.util.SimpleSettingsUtil
10+
import com.tripletres.platformscience.util.SimpleSettingsUtil.Companion.ALGORITHM
11+
import com.tripletres.platformscience.util.SimpleSettingsUtil.Companion.DB_OR_API
12+
import com.tripletres.platformscience.util.SimpleSettingsUtil.Companion.DB_OR_API_DEF
913
import dagger.hilt.android.lifecycle.HiltViewModel
1014
import kotlinx.coroutines.Dispatchers
1115
import kotlinx.coroutines.flow.MutableStateFlow
@@ -21,6 +25,7 @@ import javax.inject.Inject
2125
class SplashViewModel @Inject constructor(
2226
private val loadDriversShipmentsUseCase: LoadDriversShipmentsUseCase,
2327
private val assignDriversToShipmentsUseCase: AssignDriversToShipmentsUseCase,
28+
private val settings: SimpleSettingsUtil,
2429
) : ViewModel() {
2530

2631
private val _uiState = MutableStateFlow(SplashUiState())
@@ -34,17 +39,16 @@ class SplashViewModel @Inject constructor(
3439
viewModelScope.launch(Dispatchers.IO) {
3540
loadDriversShipmentsUseCase(getCachedSetting())
3641
updateStatus(SplashUiStatus.ASSIGNING)
37-
assignDriversToShipmentsUseCase()
42+
assignDriversToShipmentsUseCase(getAlgorithmSetting())
3843
updateStatus(SplashUiStatus.DONE)
39-
val drivers: List<DriverItem> = emptyList()
40-
LogUtils.d("Drivers: ${drivers.toString()}")
4144
}
4245
}
4346

4447
private fun updateStatus(newStatus: SplashUiStatus) {
4548
_uiState.update { state -> state.copy(status = newStatus) }
4649
}
4750

48-
private fun getCachedSetting() = true //TODO: settings from user
51+
private fun getCachedSetting() = settings.getPreference(DB_OR_API) == DB_OR_API_DEF
52+
private fun getAlgorithmSetting() = settings.getPreference(ALGORITHM)
4953

5054
}

app/src/main/java/com/tripletres/platformscience/util/SimpleSettingsUtil.kt

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,15 @@ class SimpleSettingsUtil @Inject constructor(@ApplicationContext val context: Co
2020
const val DB_OR_API_API = "API" //API option
2121
const val ALGORITHM: String = "ALGORITHM"
2222
const val ALGORITHM_GREEDY: String = "GREEDY"
23-
const val ALGORITHM_DEF: String = ALGORITHM_GREEDY //TODO: change for constant
23+
const val ALGORITHM_BRANCH_BOUND: String = "BRANCH_BOUND"
24+
const val ALGORITHM_DEF: String = ALGORITHM_BRANCH_BOUND
2425

2526
//TODO: Add more algorithms
2627
fun allAlgorithms(): List<String> {
27-
return listOf(ALGORITHM_GREEDY)
28+
return listOf(
29+
ALGORITHM_GREEDY,
30+
ALGORITHM_BRANCH_BOUND
31+
)
2832
}
2933

3034
}

0 commit comments

Comments
 (0)